|
26쪽
2.1.1 상수
상수(constant) : 값이 한 번 정해지면 그 값을 변경할 수 없는 수 (고정된 값을 갖는 수)
C 언어에서 사용되는 상수의 종류로는 정수형, 실수형, 문자형, 문자열 상수가 있다.
(1) 정수형 상수
정수형 상수는 10진수, 8진수, 16진수로 표현할 수 있다.
10진 상수 : 10, -10, 999 0~9까지의 숫자를 사용하며, 0으로 시작할 수 없다.
8진 상수 : 011, 055 0~7까지의 숫자를 사용하며, 숫자 앞에 0을 붙인다.
16진 상수 : 0xac, 0X2A 0~9와 A~F를 사용하며 숫자 앞에 0x를 붙인다.
unsigned형 상수 : 12u, 067u, 0XFAU 부호없는 상수를 표현하며, 숫자 뒤에 u나 U를 붙인다.
long형 상수 : 123456l, 0XFFL 큰 길이의 정수를 표현하며, 숫자 뒤에 l이나 L을 붙인다.
참고: 8진수 011에서, 앞의 0은 8진수라는 표시이고 뒤의 두 자리 11이 숫자의 값입니다. 즉, 0으로 시작하면 8진수라는 뜻.
16진수 0xac에서 앞의 0x는 16진수라는 표시이고 뒤의 두 자리 ac는 숫자의 값입니다.
관례상 16진수를 표기할 때는 0XAC같이 대문자를 쓰지 않고 0xac라고 소문자를 사용합니다.
unsigned형 상수 뒤의 u, U는 관례상 대문자를 사용합니다.
long형 상수 뒤의 l, L은 관례상 대문자를 사용합니다.
정리) 0 1 1 : 8진수 11의 값, 즉 8*1 + 1 ☞ 10진수 9
0 x a c : 16진수 ac의 값, 즉 16*a + c ☞ 16*10 + 12 ☞ 10진수 172
067U : 8진수 67의 unsigned형 상수, 6*8 + 7 ☞ 10진수 55값의 부호없는 정수
123456L : 10진수 123456의 long형 상수
27쪽
(2) 실수형 상수
실수형 상수는 부동소수점(浮動小數點, Floating point)형 상수라고도 하며,
정수형보다 큰 값이나 작은 값을 처리하는 데 사용된다.
실수형 상수는 double형을 기본 자료형으로 사용한다.
소수형식 : 12.345 3.14 .5 소수점을 사용하여 표현
지수형식 : 12E3(12000) 5e-2(=0.05) 10진수와 e(E)를 사용하여 표현
float형 상수 : 3.14f 3.14E-3F 숫자 뒤에 f나 F를 붙인다
long double형 상수 : 3.14l 3.14E-3L
(3) 문자형 상수
문자형 상수는 단일 인용부호(' ')로 묶여 있는 1개의 영문자나 숫자문자이다.
문자형 상수는 내부적으로 해당 문자의 ASCII 코드값이 사용된다.
또한 특별히 키보드에 나타나 있지 않은 문자들은 escape 문자(escape sequence)라고 하는데, 다음과 같은 특수한 기능을 갖고 있다.
\a 경고음(alert) 출력
\b 백스페이스(back space)
\f 새 페이지(form feed)
\n 출력시 줄 바꿈(new line)
\r 커서를 행의 시작 위치로 이동(carriage return)
\t 수평 탭(horizontal tab)
\0 ASCII 코드값 0인 문자(null 문자)
(4) 문자열 상수
문자열 상수는 이중 인용부호(" ")로 묶여 있는 복수 개의 영문자 및 숫자로 이루어진 상수이다. 문자열 상수가 기억공간에 보관될 때는 문자열 끝에 null 문자('\0')가 추가된다 ('\0', null 문자로 끝마친다).
28쪽
2.1.2 변수
변수(variable)는 프로그램 실행 도중 변할 수 있는 값이 저장되는 기억공간을 말한다.
변수는 사용하기 전에 반드시 그 변수를 선언하여 컴파일러가 기억공간에서 일정 공간을 확보할 수 있도록 해야 한다.
(1) 변수의 특징
. 모든 변수는 이름이 있다.
. 모든 변수는 정해진 자료형이 있다.
. 모든 변수는 할당된 값을 갖는다.
(2) 변수명의 정의 규칙
. 모든 변수는 사용되기 전에 선언되어야 한다.
. 변수명은 반드시 영문자나 밑줄(_)로 시작해야 한다.
. 변수명은 중간에 숫자, 밑줄(_)을 섞어서 명명할 수 있다.
. 변수명은 대·소문자를 구별하여 사용한다.
. 변수명으로 예약어들은 사용할 수 없다.
(참고) 교재 요점정리 7.에서 내장된 함수(표준 함수)명을 사용할 수 없다고 하였는데, 해당 header file을 include하지 않으면 사실상 사용할 수 있습니다. 그러나 표준 함수명을 사용하면 다른 사람이 소스 코드를 보았을 때 혼동할 수 있으므로 사용하지 말아야 합니다.
29쪽
2.2 자료형과 변수선언
2.2.1 자료형
기억공간에 이름을 부여하는 것을 변수의 선언이라고 하며, 이러한 변수의 선언을 위해 C 언어에서는 자료형(data type)이라는 것을 제공한다.
(1) 자료형의 종류
(2) 기본 자료형의 크기와 범위
. 정수형
(unsigned) short int 2 byte
(unsigned) long int 4 byte
(unsigned) int 16 bit형 : 2 byte (32 bit 형 : 4 byte)
. 실수형
float 4 byte
double 8 byte
long double 8 혹은 10 byte
.문자형
(unsigned) char 1 byte (내부적으로 ASCII 코드값으로 처리된다)
unsigned라는 말이 붙어있지 않으면 signed가 생략된 것입니다.
int = signed int, char = signed char
참고> unsigned = unsigned int, short = short int, long = long int
33쪽
2.2.2 변수의 선언
변수선언은 변수명과 변수가 가질 자료형을 지정하여 변수를 위한 기억공간을 할당하는 것
예) int a; short b; float c; char ch; char str[15];
문자열을 선언할 때는 사용하고자 하는 문자열의 크기에 1 byte를 추가한 크기로 선언해야 합니다.
예) 사용하고자하는 문자열의 크기가 20 byte일 경우는 char str[21]; 1byte는 문자열의 끝을 나타내는 null(\0)문자용.
변수선언 시 고려사항
. 변수에 저장될 값의 크기 : overflow나 underflow에 유의
. 변수의 선언 위치 : 전역변수와 지역변수
. 변수의 초기화 : 쓰레기값이 들어가지 않도록 주의
37쪽
2.3 선행처리기
2.3.1 선행처리기란?
선행처리기(preprocessor)는 컴파일에 앞서 프로그램 선두에 선언된 지시자들을 미리 처리하는 역할을 한다.
선행처리기를 사용할 때 주의해야 할 점
. 반드시 #로 시작해야 한다.
. 명령문 끝에는 세미콜론(;)을 붙이지 않는다.
. 한 줄에 하나의 명령만 쓴다.
. 소스 프로그램의 첫 부분에 위치한다.
2.3.2 파일 포함
#include <파일명> : 표준함수를 사용할 때 그 함수의 원형(prototype)이 선언된 헤더파일을 포함해야 하며
include라는 디렉토리(폴더)에 들어있음 - 헤더 파일을 포함하기 위해 사용
(예) #include <stdio.h>
#include "파일명" : 자신이나 타인이 작성한 헤더파일, 소스파일을 포함할 때 사용
(예) #include "c:\turboc\myheader\util.h"
39쪽
2.3.3 매크로 정의
매크로(macro)란 선행처리기 #define을 사용하여 단순 치환되는 자료를 말한다.
매크로 상수와 매크로 함수가 있다.
(1) 매크로 상수 정의
. 형식 : #define 매크로명 자료
#undef 매크로명
예) define PI 3.141592
(2) 매크로 함수 정의
. 형식 : #define 매크로명(인수...) (수식)
예) #define AREA(x) (3.141592*(x)*(x))
#define HAP(a, b) (a+b)
매크로를 사용할 때 주의할 점
. 매크로명은 일반 변수와 구별하기 위해 일반적으로(관례상) 대문자를 사용한다.
. 매크로 정의문 끝에는 세미콜론(;)을 사용하지 않는다. (C 명령어가 아님)
. 문자열이 한 줄을 넘어설 때는 \(\)를 사용한다.
예) #define STR "이 문장은 실습을 위한 예제\
프로그램이다"
. 매크로 정의를 해제할 때는 매크로명만 기입한다.
예) #undef STR
42쪽
2.3.4 조건부 컴파일
2학기 C++ 객체지향 프로그램에서 다시 등장하므로 조건부 컴파일이 선행처리기에 의해 처리된다는 사실만 기억해두시기 바랍니다.
. 형식 1) #if 조건 2) #if 조건 3) #if 조건1
명령문; 명령문1; 명령문1;
#endif #else #elif 조건2
명령문2; 명령문2;
#endif #else
명령문3;
#endif
(참고) 교재 42쪽 아래 표에서 명령문3이 2) 조건의 아래에 있는데 이는 인쇄 오류같습니다.
48쪽
연습문제
1. 다음 중 C 프로그램의 변수의 정의 규칙으로 잘못된 것은?
가. 모든 변수는 사용되기 전에 정의한다.
나. 변수명을 사용할 때 대소문자를 구별하지 않는다.
다. 변수명으로 예약어들은 사용할 수 없다.
라. 변수명은 영문자로 시작해야 하며, 밑줄(_)을 섞어서 사용할 수 있다.
☞ 변수명 val, Val, VAL은 모두 다른 변수들이됩니다. 즉 대소문자를 구별하지 않을 경우 변수명의 갯수에 제약을 받지만 구별할 경우 변수명의 갯수는 무한하게 많이 만들어질 수 있습니다. 특히 비밀번호등에서 대소문자를 구별함으로써 비밀번호의 가지 수를 무한하게 사용할 수 있는 것처럼...
2. 다음 변수의 사용 방법 중 틀린 것은?
가. int age, weight, height;
나. int age = 20;
다. int age = 20, weight, height = 30;
라. int age = 20, float sum = 0.0;
☞ 다른 종류의 변수명을 컴마(,)로 구별하여 한 줄에 선언할 수는 없습니다. 그러나 다음과 같이 선언하는 것은 가능합니다.
C 컴파일러는 줄바꿈기호, 스페이스(공백), tap문자 - 이 세가지를 통틀어 공백문자라고 합니다 - 를 구별하지 않습니다(문자열 상수 내에서는 구별합니다). 하나의 스페이스(공백)으로 치환합니다.
int age = 20; float sum = 0.0;
3. 다음과 같은 자료형을 크기 순으로 올바르게 연결한 것은?
☞ 단, int는 2 byte로 간주합니다. int 시스템이나 운영체제에 따라 16bit환경에서는 2byte이고 32bit 환경에서는 4byte 입니다.
2byte일 경우 int는 short int와 같은 크기가 되고 4byte일 경우 int는 long int와 같은 크기가 됩니다.
① int ② float ③ char ④ double
가. ③ char ① int ② float ④ double
☞ char 1 byte, int 2 byte, float 4 byte, double 8 byte
4. 다음 중 상수에 대한 설명으로 올바르지 않은 것은?
가. 8진 상수를 표현할 때는 숫자 앞에 0을 붙인다.
나. 16진 상수를 표현할 때는 숫자 앞에 0x를 붙인다.
다. 실수형 상수는 지수 형식으로 표시할 수 없다.
라. 문자형 상수는 내부적으로 정수값이 사용된다.
☞ 실수형 상수는 소수형식과 지수형식으로 표현할 수 있습니다.
문자형 상수는 내부적으로 정수값이 사용됩니다.
5. 선행처리기(preprocessor)의 설명으로 올바르지 않은 것은?
가. 반드시 #으로 시작해야 한다.
나. 명령문 끝에는 세미콜론(;)을 붙인다.
다. 한 줄에 하나의 명령만 쓴다.
라. 선행처리 문자열이 한 줄을 넘어설 때는 \를 사용한다.
☞ 선행처리기에는 세미콜론을 붙이지 않습니다.
6. 다음 프로그램의 결과는?
#include <stdio.h>
void main()
{
int p = 32767;
int n = -32768;
printf("%d", p+1);
printf("%d", n-1);
}
답) -32768 32767
교재 34쪽 예에 나온 프로그램을 살짝 변형한 것입니다. 같은 값이 출력됩니다.
overflow/underflow에 관한 설명이기 때문에 프로그램 자체를 이해하기보다는 자료형의 성격만을 이해하시면 됩니다.
참고)
overflow나 underflow가 확실한 경우,
양수는 양수의 한계값에 도달하면 음수의 한계값에서 0으로 향하고
음수의 한계값에 도달하면 양수의 한계값에서 0으로 향한다, 즉,
양수 + 양수일 경우 ... 32766 32767 -32768 -32767 -32766... x + y일 경우 : z = 32767 - x, 결과값은 -32768 + z
음수 - 음수일 경우 ... -32766 -32767 -32768 32767 32766 ... x - y일 경우 : z = 32768 - x, 결과값은 32767 - z
라고 기억하시면 될 것 같습니다. 자세한 것은 상급학년 자료구조에서 자세한 설명이 나올 겁니다. 그 때 이해하시면 됩니다.
위 문제의 경우는 절대값을 계산한 다음 부호를 바꾸면 됩니다.
7. 다음 프로그램이 있을 때 물음에 답하라.
#include <stdio.h>
void display_line(void); // (3) 함수의 원형(prototype) 선언
void main()
{
display_line();
printf(\n This is a Example program!\n");
display_line();
}
/* print asterisk line */ // (4) 설명문
void display_line(void) // (2) 함수 정의 시작
{
int counter; // (1) 변수 선언
for (counter = 0; counter < 20; counter++)
printf("*");
} // (2) 함수 정의 끝
(1) 변수 선언은 어디에서 이루어지고 있는가?
(2) 함수 정의 부분은 어디인가?
(3) 함수의 원형(prototype) 선언은 어디에서 이루어지고 있는가?
(4) 설명문은 어디인가?
8. 다음의 변수명이 올바른지, 올바르지 않은지를 나타내고, 올바르지 않으면 그 이유를 설명하라.
(1) KHK_1 올바름
(2) $time $를 사용할 수 없음
(3) 2_to_4 숫자로 시작할 수 없음
(4) name and address 공백문자를 사용할 수 없음
(5) lone 올바름
(6) double 실수형(부동소수형)을 나타내는 예약어로 변수명으로 사용할 수 없음
(7) b_rtn 올바름
9. 다음 상황에 맞게 상수(symbolic constant)와 매크로를 정의하라.
반지름(radius)을 이용하여 원 길이를 구하는 CERCUMPERENCE라는 함수를 매크로를 사용하여 정의한다.
(1) 3.141592값을 같는 상수 PI를 정의하라.
#define PI 3.141592
(2) 함수 CERCUMPERENCE를 매크로를 사용하여 정의하라.
#define CERCUMPERENCE(radius) ((radius + radius) * 3.141592)
또는
#define CERCUMPERENCE(radius) (radius * 2. * 3.141592)
혹은 (1)이 정의되어 있다는 전제하에
#define CERCUMPERENCE(radius) ((radius + radius) * PI)
또는
#define CERCUMPERENCE(radius) (radius * 2. * PI)
원의 둘레를 구하는 공식은 지름 * 원주율이고, 지름은 반지름 + 반지름, 혹은 반지름 * 2이므로 위와 같은 작성하게 됩니다.
컴파일하기 전 전처리기는 그 단어가 발견되는 곳에 그 수식을 먼저 전개해서 끼워주는데 이 때 연산 우선순위에 혼란을 줄 수 있으므로 그런 위험을 방지하기 위해 통상 수식은 괄호로 감싸줍니다.
http://cafe.daum.net/c-study/4tdN/11 ☞ C프로그래밍의 관례 1번 참고
아래와 같이 사용합니다.
#include <stdio.h>
#define PI 3.141592
//#define CERCUMPERENCE(radius) ((radius + radius) * 3.141592)
//#define CERCUMPERENCE(radius) (radius * 2) * 3.141592)
//#define CERCUMPERENCE(radius) ((radius + radius) * PI)
#define CERCUMPERENCE(radius) (radius * 2. * PI)
void main()
{
float radius = 3.;
printf("반지름 : %f, 원의 둘레 : %f", radius, CERCUMPERENCE(radius));
}
☞ 2라고 하지 않고 2. 으로 해준 것은 그 숫자가 실수형 상수라는 것을 명시해주는 것입니다. PI값이 double이므로
연산을 위해 변수의 형태를 맞춰준 것입니다. 같은 이유로 radius도 float로 선언했으며 float는 내부적으로 double로 연산됩니다.
10. 다음 상황에 맞는 선행처리기를 써라.
1. 매크로 상수 CELSIUS가 이전에 정의되었다면,
2. 0.5555555*(t-32)를 나타내는 매크로 temperature를 정의하라.
3. 정의되어 있지 않다면 1.8*t+32를 나타내는 temperature를 정의하라.
매크로로 정의하라고만 했지만 temperature가 소문자로 된 것으로 보아 매크로 함수로 정의하라는 뜻으로 이해할 수 있습니다.
매크로 함수의 경우는 일반 함수처럼 쓰기 위해 관례상 대문자를 쓰지 않고 소문자를 사용합니다.
#include <stdio.h>
//#define CELSIUS 1
#ifdef CELSIUS
#define temperature(t) (0.5555555*(t-32))
#else
#define temperature(t) (1.8*t+32)
#endif
void main()
{
float c;
scanf("%f", &c);
printf("%f\n", temperature(c));
}
주의) 매크로함수명과 식별자 리스트 사이에 공백이 있으면 안 됩니다.
#define temperature (t) (1.8+t+32) <--- (x)
이렇게 하면 temperature를 (t)(1.8*t+32)로 매크로 정의하는 것이 됩니다.
참고) 매크로로 정의한 경우
#include <stdio.h>
//#define CELSIUS 1
#ifdef CELSIUS
#define temperature (0.5555555*(t-32))
#else
#define temperature (1.8*t+32)
#endif
void main()
{
float t;
scanf("%f", &t);
printf("%f\n", temperature);
}
여기서 temperature가 소문자로 쓰여 변수와 구별이 되지 않으며 변수 t의 존재가 보이지 않아 혼란스러울 수 있으므로 매크로 함수로 정의하는 것이 바람직합니다.
기출문제
1. 다음의 자료형에서 크기가 가장 큰 자료형은? <2011 동계>
① int ② char ③ double ④ unsigned long int
2. 다음의 자료형에서 크기가 가장 큰 자료형은? <2007 기말>
① float ② long int ③ double ④ unsigned long int
<int 2 or 4 byte, char 1 byte, double 8 byte, unsigned long int(unsigned long) 4 byte, float 4 byte, long int 4byte>
3. 다음 중 C언어의 예약어(Reserved Word)가 아닌 것은? <2011 동계>
① static ② break ③ sizeof ④ play
C언어 예약어는 내장 에디터에서 다른 글자와 다른 색(파란색 등)으로 표시됩니다.
4. 문자형(character type) 상수에 대한 설명으로 올바르지 않은 것은? <2011 동계>
① char형은 한 문자를 기억한다.
② 문자는 내부적으로 ASCII 코드 값으로 처리한다.
③ 문자의 치환시 단일 인용 부호(' ')로 묶는다.
④ 문자의 입력시 문자의 끝에 Null 문자('\0')가 붙는다.
5. 문자형(character type) 상수에 대한 설명으로 올바르지 않은 것은? <2010 기말> <2006 기말>
① char형은 한 문자를 기억한다.
② 문자는 내부적으로 ASCII 코드 값으로 처리한다.
③ 문자의 치환시 단일 인용 부호(' ')로 묶는다.
④ 문자의 치환시 이중 인용 부호(" ")로 묶는다.
6. 다음 중 상수에대한 설명으로 올바르지 않는 것은? <2011 동계> <2010 기말> <2005 기말>
① 8진 상수를 표현할 때는 숫자 앞에 0(영)을 붙인다.
② 16진 상수를 표현할 때는 숫자 앞에 0x를 붙인다.
③ 실수형 상수는 지수형식으로 표현할 수 없다.
④ 문자형 상수는 내부적으로 정수 값이 사용된다.
7. 다음 중 변수에 대한 설명으로 올바르지 않은 것은? <2011 동계> <2005 기말>
① 모든 변수는 이름이 있다.
② 모든 변수는 정해진 자료형이 있다.
③ 모든 변수는 할당된 값을 갖는다.
④ 모든 변수는 항상 같은 값을 갖는다.
8. 다음 중 매크로 정의가 올바르게 된 것은? <2011 기말> <2009 기말>
① #include condition 1
② #define condition 1
③ #include <condition 1>
④ #define condition=1
9. 다음 중 매크로 정의가 올바르게 된 것은? <2006 기말>
① #define condition 1;
② #define <condition 1>;
③ #define condition 1
④ #define <condition 1>
10. 다음 중 매크로(macro)의 설명으로 올바르지 않은 것은? <2005 기말>
① 매크로명은 일반변수와 구별하기 위해 대문자를 사용하는 것이 좋다.
② 매크로 정의문 끝에는 세미콜론(;)을 사용하지 않는다.
③ 매크로는 상수와 함수중 함수만 정의할 수 있다.
④ 매크로 정의를 해제할 때는 매크로명만 기입한다.
※ (11~16) 다음과 같은 프로그램이 있을 때 물음에 답하시오.
#include <stdio.h> ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ㉠ void display_line(void); ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ㉡ void main() { ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ㉢ display_line(); ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ㉣ printf(\n This is a Example program!\n"); display_line(); } /* print asterisk line */ ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ㉤ void display_line(void) { ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ㉥ int counter; ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ㉦ for (counter = 0; counter < 20; counter++) ㆍㆍ㉧ printf("*"); } |
11. 위에서 변수 선언은 어디에서 이루어 지고 있는가? <2011 기말>
㉦
12. 위에서 설명문은 어디인가? <2011 기말> <2010 기말>
㉤
13. 위에서 선행처리기는 어디인가? <2011 기말>
㉠
14. 위에서 사용자 정의 함수의 헤더(header) 부분은 어디인가? <2010 기말>
㉥
15. 위에서 사용자 정의 함수의 원형(prototype)선언은 어디에서 이루어지고 있는가? <2010 기말>
㉡
16. 위에서 사용자 정의 함수의 호출이 일어나는 부분는? <2010 기말>
㉣
※ (17~18) 다음과 같은 프로그램이 있을 때 물음에 답하시오.
(여기서 'A'의 값은 65이다.)
#include <stdio.h> void main() { char var='A'; printf("var1=%d var2=%c", var, var); ----㉠ putchar(var+2); -----------------------㉡ } |
17. 위에서 ㉠의 결과로 올바른 것은? <2008 기말>
① var1=65 var2=A ② var1=a var2=65 ③ var1=a var2=A ④ var1=65 var2=65
18. 위에서 ㉡의 결과로 올바른 것은? <2008 기말>
① 65 ② 67 ③ A ④ C
.2장 끝.