▶ 문자열의 내부 구조
C언어에서 문자열은 끝에 코드 0(수치 제로)을 붙여 표현한다. 예를 들어 "abcde"라는 문자열은 메모리 내부에서는 다음과 같이 기억된다.
따라서 문자열을 표시하려면 [문자열이 길이 +1]의 메모리 영역이 필요하게 된다. 또한 문자열을 처리할 때 '0이 나올 때까지 처리를 한다'는 식으로 처리를 하게 된다.
▶ 문자열의 내부 구조
문자열의 끝은 아스키 코드로 0이다. 이것을 표현할 때는 단순히 [0]이라고 쓰는 방법과 이스케이프 문자를 이용해 [\0]이라고 쓰는 방법이 있는데, 모두 동일하게 제로를 의미한다. 그러나 양자에는 다음과 같은 뉘앙스의 차이가 있다.
0 -단순한 수치로서의 0이다.
\0 -문자열의 끝으로서의 0이다.
따라서 문자열의 끝을 나타낼 때는 그 의미가 보다 잘 전달되는 \0을 이용하는 편이 바람직하다. 예를 들어
if(s[i]==0)
라고 쓰기보다는
if(s[i]=='\0')
라고 하면 이 프로그램이 문자열을 처리하고 있다는 것이 명확해진다.
▶ 주석
주석문은 다음과 같이 범위 지정형을 채용한다.
/* 주석문의 시작
*/ 주석문의 끝
/*가 일단 등장하면 행의 단락에 관계없이 */가 나올 때까지 주석문이 된다. 주석문은 공백을 넣을 수 있는 위치라면 어디든 표시할 수 있다. 주석문의 경우 /*~*/의 안에 또 /*~*/가 있어서는 안 된다. 그러나 특별 스위치를 켬으로써 이러한 주석문을 허용하는 시스템도 있다.
▶ 예약어
ANSI C에서 예약어는 다음과 같다, 예약어는 식별자로 사용할 수 없다.
예약어 일람
auto do goto signed while break double if sizeof unsigned case else int static void char enum long struct voatile const extern register switch continue float return typedf default for short union |
▶ 식별자
식별자란 변수, 기호정수, 함수 등에 붙이는 이름을 말한다. 이름으로 쓰일 수 있는 문자는 다음과 같이 정해져 있다.
이름으로 사용할 수 있는 문자
A~Z , 0~9, _밑줄
명명할 때는 다음 규칙을 주의하자.
● 이름은 영문자 또는 _(밑줄)로 시작해야 한다.
● 이름은 맨 처음부터 31문자의 길이까지 식별된다.
● 예약어를 사용해서는 안되지만 예약어를 포함하는 이름은 괜찮다.
▶ 문자 내림과 프리 포맷
C는 프리 포맷 형식의 기술을 허용하고 있다 「기술은 행의 맨 처음부터 시작해야 한다」는 규정은 없다. 따라서 프로그램은
#include <stdio.h> main( ) { int i; for (i=1; i<=5; i++){ printf("%d\n",i); } } |
와 같이 문자를 내려 피제어 범위를 명확히 해두는 편이 보다 알아보기 쉽다. 몇 문자를 어떤 식으로 내릴 것인지는 프로그래머가 자신의 취향에 따라 결정하면 된다. 문자 내름은 4문자 또는 8문자를 기준으로 하는 것이 보통이다.
▶ 식
식이란 정수나 변수 자체, 또는 그것들을 연산자로 결합하는 것을 뜻한다. 함수 불러오기도 식에 포함된다. 다음과 같은 것이 식이다.
1.식의 예
a, 10, ++c, a+b, a=100, a>2000, "abcdefg", printf("hello\n")
식에 세미콜론을 붙이면 문이 되는데 이것을 「식문」이라고 한다.
2. 식문
식; |
다음은 식문이다.
3. 식문의 예
(1) a;
(2) 10;
(3) ++c;
(4) a+b;
(5) a=100;
(6) a>2000;
(7) "abcdefg";
(8) printf("hello\n");
이 중 (3), (5), (8)의 예는 자주 쓰이는 문이다. 한편 (1),(2),(4),(6),(7)의 예는 이상하게 보이지만 C문법 상에서는 올바른 문이다. 예를 들어
#include <stdio.h> main( ) { 100; "abcde"; } |
와 같은 프로그램은 정상적으로 컴파일된다. 그러나 이것은 실행시켜도 쓸모없는 프로그램이 된다. 그러므로 실제로 쓰이는 식문은 다음과 같다.
대입, 증가/감소 연산, 함수 불러오기
▶ 정수식
식 안에는 정수식이라고 불리는 것이 있다. 이것은
-정적 변수의 초기 설정시 초기값은 정수식이어야 한다.
와 같이 쓰인다. 정수식은
-컴파일시 정수로서 평가할 수 있는 식
이다. 예를 들어 식의 설명에서 다룬 예 중
10
은 식이자 정수식이다. 그러나 변수 a를 사용한
a
는 식이지만 정수식은 아니다. 문맥을 훍어보지 않으면 a의 값을 알 수 없는데, 컴파일시 문맥을 살펴보지는 않으므로 이것은 정수가 될 수 없다.
예를 들어 「정적 변수의 초기화는 정수식으로 한다」는 규정이 있다고 하자. 이 경우 다음과 같은 구분이 필요하게 된다.
static int a=100; ...정수식이므로 이 초기화는 올바르다
static int b=a; ...정수식이 아니므로 이 초기화는 오류이다.
또한 자동 변수의 초기 설정은 정수식이 아닌 식이다. 따라서
int c=100;
int d=getchar();
라고 할 수 있다. 그러나 정적 변수의 초기값은 정수식으로 제한되므로
static int d=getchar();
는 오류가 된다.
정수식 안에는 대입, ++연산자, --연산자, 함수 호출, 콤마 연산자를 포함할 수 없다.(sizeof 연산자 안에는 쓸 수 있으나 이것은 아무 효과가 없다).
▶ 문
문은 프로그램의 실행을 위한 최소 구성 단위 이다. 문은 여러 차례 실행되며 실행됨으로써 어떤 효과를 남긴다. 문에 관한 규칙을 정리한 것이 문법이다. 문은 다음과 같은 요소로 구성된다.
식문
공문
라벨 첨부문
복문 - { }
선택문 - if switch
반복문 - for while do-while
점프문 - goto continue break return
▶ 공문
공문은 식이 없는 문이다. 명찰이나 공의 본체를 넣기 위해 쓰인다. 예를 들어 단순한 루프를 1000회 실행하고 싶을 때는
for(i=1; i<=1000; i++)
; ...이것이 공문
라고 한다. 이 프로그램에서 공문은 생략할 수 없다. 왜냐하면 C의 for문은「for 문 다음에 나오는 문장 한 개를 제어해야 하기」때문이다. 따라서
-분명히 문이 하나 있지만 어떤 효과도 없다.
와 같이 기술해야 하는 것이다.
▶ 세미콜론의 역할
파스칼에서 세미콜론(;)은 멀티 스테이트먼트 기호(분리기호)이다. 예를 들어 2개의 문이 연속되어 있을 때 파스칼에서는
a:=100; b:=200
라고 쓴다. 여기서 세미콜론은 2개의 문을 연속해서 쓸 때 그것을 분리하기 위한 구분마크 역할을 한다. 따라서 「b:=200」의 뒤에는 세미콜론이 붙어 있지 않다. 그러나 C에서는 동일한 2개의 문을
a=100; b=200;
라고 쓴다. 여기서 세미콜론은 각 식의 뒤에 붙어 있다. 「b=200」의 뒤에도 세미콜론이 붙어 있는 것은
- C에서 세미콜론은 멀티 스테이트먼트 기호가 아닌 문의 일부
이기 때문이다. 이처럼 세미콜론이 문장의 끝을 의미하기 때문에 여러 개의 문장을 연속해서 써도 각 문장을 식별할 수 있다. 결과적으로 C의 세미콜론은 멀티 스테이트먼트 기능을 보유하고 있는 셈이다.
▶ 하나의 문
C에서 if, while 등의 제어문은 다음에 나오는 문장 한 개를 제어하게 되어 있다. 이 때 「단일문」 의 종류는 다음과 같다.
단순문
a=10;
복문
{a=10; b=20;}
콤마 연산자로 결합된 문
a=10, b=20;
▶ 식의 값
통상 if문 등의 조건식 안에서는 다음과 같이 어떤 값을 발생시키는 식을 쓴다.
a>100
이 식은 참이면 1, 거짓이면 0이라는 값을 발생시키는데, 이것을
식의 값
이라고 부른다. 이 값에 기초해 if문이 조건을 판단하는 것이다. 일반 언어(예를 들어 파스칼)에서는 값을 발생시키지 않는 식은 조건식으로 쓸 수 없기 때문에 2단에 걸쳐 기술해야 한다. 그러나 C에서는
- 대입문에도 식의 값을 갖게 한다.
는 개념을 도입했다. 대입문도 식의 값을 가질 수 있으므로 조건식 안에 대입문을 직접 쓸 수 있어 보다 간결한 기술이 가능해지게 된 것이다. 두 줄에 걸쳐 기술할 필요없이 한 행에서 기술할 수도 있다. 다음은 식의 값을 이용한 대표적인 처리 예이다.
한 문자 읽기 처리
while((ch=getchar()) != EOF){ ...식의 값은 ch(와 동일한 값)가 된다
...
}
파일 열기 처리
if((fp1=fopen(filename, "r"))==NULL){
...식의 값은 fp1(과 동일한 값)이 된다
printf("파일을 열 수 없습니다.\n");
exit(1);
}
만일 「대입문의 식의 값」이라는 기능이 없었다면 문자 한 개를 읽어 조건식에 적용시킬 때 다음과 같이 쓸 수밖에 없다.
ch=getchar();
while(ch != EOF){
...
ch=getchar();
}
또한 C에는 색다른 기술이 많지만 그런 경우에도 식의 값은 다음과 같이 명확하다.
a=b=c=100; ...식의 값은 100
a=10,b=20,c=30 ...식의 값은 30
'C언어 다시 다지기' 카테고리의 다른 글
DAY004 변수의 초기화 (0) | 2018.04.30 |
---|---|
DAY003 변수의 선언 (0) | 2018.04.30 |
DAY002 숫자를 저장하는 변수 (0) | 2018.04.26 |
DAY001 변수란? (0) | 2018.04.17 |
C의 기본적 지식(1) (0) | 2018.03.11 |