프로그래밍/C

2.3 상수(Constants)

피노리코 2014. 10. 27. 23:31

정수형 상수 1234 같은것은 int 이다. long 상수는 123456789L 과 같이 l 또는 L로 끝나며 int에 체워지기에 너무 큰 정수는 long으로 간주한다. 무부호형 상수는 u 또는 U로 끝나고 접미또는 UL은 unsigned long을 의미한다.

부동소수형 상수는 소수점(123.4)이나 지수(le-2)를 가지며,접미사가 없을 경우에는 배정도로 간주된다 접미사 f혹은 F는 부동상수를 나타내며,l이나 L은 long double을 나타낸다.

정수값은 10진수 대신에 8진수나 16진수로 표기할 수 있다. 0이 앞에 나오면 8진수를,0x혹은 0X가 앞에 나오면 16진수를 나타낸다. 예를 들면,10진수 31은 8진수 037 혹은 16진수 0xlf나 0XLF로 쓸 수있다. 8진수나 16진수 상수에도 L이나 U를 붙여 long 또는 unsigned 로 만들수 있다.

0xFUL은 10진수 15의 unsigned long const 이다 문자 상수는 'x'와 같이 ' ' 안의 하나의 문자로 나타내며 정수 값을 가진다 예를들면 ASCII 문자집합에서 문자상수 '0'은 48이라는 값을 갖는다 문자상수는 다른 정수와 마찬가지로 숫자 연산을 할 수 있으며 보통 다른문자와 비교하는 데 쓰인다.

어떤 문자는 \n과 같이 escape sequence(escape 문자)에 의해 문자나 문자열로 표현할수 있는데 두개의 문자처럼 보이지만 실은 한 문자를 나타낸다 또한 임의의 크기를 같는 비트 패턴(bit pattern)은 한 개에서 세 개까지의 8진수(0~7)를 써서


'\000'


로 나타낼수 있고, 혹은 하나 내지 두개의 16진수(0~9,a~f,A~F)를 써서


 '\xhh'


로 쓸수 있다

따라서


#define VTAB '\013' /* ASCII vertical tab */

#define BELL '\007' /* ASCII bell character */


혹은 16진수로


#define VTAB '\xb' /* ASCII vertical tab */

#define BELL '\x7' /* ASCII bell character */


로 써도 된다


escape sequence를 모두 열거하면 다음과 같다


\a   beep

\b   backspace

\f   formfeed

\n   newline

\r   carriage return

\t   tab

\v   vertical tab

\\   backslash

\?   물음표

\'   작은따옴표

\"   큰따옴표

\000 8진수

\xhh 16진수


문자 상수 '\0'은 값이 0이고 null 문자를 나타낸다.

0이라고 쓰는 대신에 '\0'은 더 자주 쓰이는 이유는 이것이 문자로 사용된다라는것을 더 잘나타내기 떄문인데 숫자로는 0일 뿐이다.

constant expression은 상수만을 포함하는 수식이다. 이들은 실행할 떄가 아니라 컴파일 시에 값이 정해지므로 상수가 나타날 수 있는 곳이면


#define MAXLINE 1000

char line[MAXLINE+1]; 


또는


#define LEAP 1 /* in leap years */

int days[31+28+LEAP+31+30+31+30+31+31+30+31+30+31];


과 같이 어디든지 쓸수있다.

string constant는


"I am a string"


또는


"" /* the empty string */


와 같이 문자열에 따옴표를 붙여서 사용한다 따옴표는 문자열에 포함되지 않고 구분하기 위해 쓰인다 문자상수에 쓰이는 escape sequence는 문자열 상수에도 쓰여서 \"는 큰 따옴표 문자를 나타낸다. 문자열 상수는 컴파일 시에 연결될수 있다. 따라서


"hello","world"


"hello,world" 와 같다


이는 긴 문자열을 여러라인에 걸쳐 쓸떄 편리하다.

문자열은 문자의 배열이다 내부적으로 표현할때 문자열은 그 끝에 '\0'을 가지고 있어서 실제로 기억장소는 따옴표 안에 있는 개수보다 한개더 필요하다 이방법은 문자열의 길이에 제한이 없다는 좋은점은 있지만프로그램이 길이를 알기 위해서는 문자열을 완전히 scan해야 한다. 표준하이브러리 함수인 strlen은 끝늬 '\0'을 뺸 문자열 길이를 리턴해준다


/* strlen : return length of s */

int strlen(char s[])

{

    int i;

    

    i=0;

    while (s[i] !='\0') {

        ++i;

        return i;

    }

}


strlen과 그 밖의 다른 문자 함수들은 표준헤더인  <string.h> 에 선언되어 있다.

문자상수와 하나의 문자를 가진 문자열은 확실히 구분되어야한다 'x'와 "x"는 다르다 전자는 charactor set x 이고 후자는 문자배열로 하나의 문자 x와 '\0'으로 이루어져 있다.


산수에는 enumeration 상소라는 형식이 있다 열거란 다음과 같은 정수형 상수의 나열이다


enum boolean { NO, YES };


따로 지정되지 않으면 집합 안 첫번쨰 이름값은 0,1,2 등의 값을 차례로 갖는다. 값이 지정되지 않은 것은 앞의 것보다 1 큰값을 갖게 된다.


enum escapes { BELL = '\a', BACKSPACE = '\b',TAB ='\t',

               NEWLINE = '\n',VTAB = '\v' ,RETURN = '\r' };


enum escapes {JAN = 1, FAB, NAR, APR, MAY, JUN,

              JUL ,AUG, SEP, OCT, NOV, DEC };

                /* FEB is 2,MAR is 3, etc. */


열거 내에서 상수의 이름은 모 달라야 하지만 값은 같을수도 있다.

enum 을 사용하면 #define 으로 상수를 하나하나 지정해 주는 것보다 편리하게 여러 개의 상수를 지정할 수 있다. 컴파일러는 열거형 변수가 맞게 사용되었는지를 확인하지 않으므로 프로그래머가 잘 확인해야 한다 열거형 변수의 값을 확인하기 위해서는 디버거를 사용해야한다