본문 바로가기
dev

C언어 상수 개념

by 공뭉 2020. 6. 21.
반응형

써야지써야지 하다가 게을러서 이제서야 쓴다 ㅠㅠ

이번엔 프로그래밍에서 빠질 수 없는 상수에 대해 알아보자.
상수는 프로그램이 실행되는 동안 변하지 않는 값으로 수치상수, 문자열상수, 문자상수 등이 있다.

1.수치상수

계산에 이용되는 수치상수는 크게 고정소수점상수, 부동소수점상수로 분류된다.
고정소수점상수는 정수를 의미하고 8진, 10빈, 16진 정수로 분류된다.
부동소수점상수는 실수를 의미하고 지수표현과 소수점표현으로 분류된다.

정수의 소수점 위치는 항상 고정되어있고 실수의 소수점 위치는 고정되어 있지 않기 때문에 이런 용어가 붙어진 거다.

#include <stdio.h>

int main() {

	/* 10진수 28을 %d(10진 정수) 형태로 출력한다. */
	printf("%d\n", 28);
	
	/* 08진수 753를 %d(10진 정수) 형태로 출력한다. */
	printf("%d\n", 0753);
	
	/* 16진수 A1C를 %d(10진 정수) 형태로 출력한다. */
	printf("%d\n", 0xA9C);
	
	/* 소수점값1.234을 %f(실수) 형태로 출력한다. */
	printf("%f\n", 1.234);
	
	/* 지수값 0.5E-2를 %f(실수)형태로 출력한다. */
	printf("%f\n", 0.5E-2);
	
	return 0;
}

실행결과
28
491
2716
1.234000
0.005000

printf 문에서는 일반적으로 “” 사이에 있는 내용을 그대로 출력하지만,
그안에 %d 처럼 %로 시작하는 내용이 있으면 그대로 출력하는 것이 아니라
큰따옴표밖에있는 인수의 내용을 출력하라는 의미가 된다.

여러가지 문자를 사용해 출력형식을 지정할수있으며
출력형식을 잘못지정하면 원하는 값을 출력못하는 실수가 발생하니 주의해야한다.
%d : 인수를 10진수 형태로 출력
%o : 인수를 8진수 형태로 출력
%x : 인수를 16진수 형태로 출력
%f : 인수를 실수(소수점형식)형태로 출력
%e : 인수를 실수(지수형식)형태로 출력
%g : 인수를 %f와 %e중 짧고 보기 좋은 형태로 출력
그리고 %문자가 여러개 있다면 인수 역시 여러개가 있어야 하고 ,로 구분한다.

#include <stdio.h>

int main() {
	/* %가 여러개면 대응되는 인수도 ,로 구분하며 여러개 입력 */
	printf("%d %d %d", 93, 030, 0xA9);
	
	return 0;
}

실행결과
93 24 169

2.문자상수

문자상수는 ‘c’와 같이 작은따옴표 사이에 문자를 입력하여 생성한다.
모든 문자상수는 시스템에서 문자를 표현하기위해 사용되는 코드에 따라 대응되는 정수값이 있다.

예를들어 ASCII코드를 사용하는 시스템에서 ‘c는 다음과 같이 표현되므로 값이 99이된다.
1100011
즉, ch = ‘c’; 는 ch = 99; 와 같은 의미가 된다.
그러나 앞서 말했듯이 정수값은 시스템에서 사용되는 코드에 따라 달라지므로
정수값을 직접 이용하는 것보다는 문자상수를 이용하는것이 바람직하다.

또한, 한가지 주의해야 할 점으로
‘9’는 ‘ ‘ 로 싸여있으므로 수치상수가 아니라 문자상수다.
문자상수 ‘9’은 ASCII코드 0111001으로 표현되므로 57이라는 정수값을 갖는다.
이러한 문자상수도 printf를 이용해 출력할수 있다.

#include <stdio.h>

int main() {

	/* 정수 99 */ 
	printf("정수 99 : %d\n", 99);
	
	/* 문자열상수 c의 정수값 */ 
	printf("문자열상수 c의 정수값 : %d\n", 'c');
	
	/* 주의 싱글쿼텐션(' ')으로 감싸면 숫자도 문자상수가 된다 */
	printf("문자상수를 정수로 뽑는 실수 : %d\n", '9');
	
	/* 정상적인 출력을 위해선 문자상수니까 %d가 아니라 %c라 해야한다. */ 
	printf("문자상수를 문자상수로 정상출력 : %c\n", '9');
	
	/* 참고 */
	printf("%c %c %c\n", 'T', 100, '5'); 
	
	return 0;
}

실행결과
정수 99 : 99
문자열상수 c의 정수값 : 99
문자상수를 정수로 뽑는 실수 : 57
문자상수를 문자상수로 정상출력 : 9
T d 5

3.문자열 상수

문자열상수는 문자를 나열한 것으로 큰따옴표를 사용해 표현한다.
또한, 문자열의 끝에는 마지막임을 의미하는 NULL(‘\0’)문자가 포함되어있다.
따라서 “Hello”를 표현하기 위해서는 5바이트가 아닌 6바이트 공간이 필요하다.
‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’

즉, 문자상수’H’와 문자열상수 “H”는 전혀다른 의미를 지닌다.
‘H’
‘H’’\0’
이러한 문자열 상수도 printf를 이용해 화면에 출력할수있다.
printf의 출력형식에서 문자열 상수와 관련된 변환 문자열은 %s다.

#include <stdio.h>

int main() {

	Printf("%s\n%s\n", "Hello", "C Programming");	
	
	return 0;
}

실행결과
Hello
C Programming

 

4.기타

4-1. 확장문자열
printf에서 다음줄로 넘기기위해 ‘\n’이라는 특수문자를 사용했는데
이것이 바로 확장문자열이다.(escape sequence)
확장문자열은 printf 함수에서 제어를 위해 사용되며 ‘\’와 하나의 문자로 구성된다.
또한, 화면에 표시되지않고 다음과 같이 특수한 의미를 지니고있다.
a : 경고음
b : 백스페이스
n : 개행
t : 수평탭
v : 수직탭
\ : 백슬래시
? : 물음표
‘ : 작은따옴표
“ : 큰따옴표

#include <stdio.h>

int main() {
	/* \t : tab, \n : 개행 */
	printf("%s\t%s\n", "C", "Programming");
	printf("%s\’s name\n", "Kim");
	
	return 0;
	
}

실행결과
C       Programming
Kim’s name


4-2. 기호상수
기호상수는 프로그램내에서 의미있는 이름이나 기호로 표시하는 상수로
실제상수와 같이 내용변경이 불가능하다.
하지만 실제 상수보다 사용이 편하고 이해가쉽다.

예를들어,
원주율을 근사값 3.14159265로 직접 사용하는것보다 PI라는 기호상수를 만들어 사용하는것이 편리하고
버퍼의 크기가 1024라고했을때 1024라는 실제상수를 사용하는것보다 BUFSIZE와 같은 기호상수를 만들어
사용하는것이 프로그램을 이해하기쉽다.

기호상수는 #define로 정의해야 사용할수있고 일반적으로 대문자로 표시한다.

#include <stdio.h>

#define BUFSIZE 12

int main() {

	/* 컴파일하기전에 BUFSIZE는 12로 바뀜 */
	printf("%d\n", BUFSIZE);

	return 0;	
}

실행결과
12


4-3. 열거형상수
enum이라는 예약어로 정의하는 열거형 상수는 int형으로, 기호상수와 동일한 목적으로 사용된다.
그러나, 기호상수는 하나의 상수를 나타내지만, 열거형은 상수들의 집합을 나타낸다.

enum 열거형이름 {상수1, 상수2, ...};
만약 다음과 같이 정의되는 열거형상수가 있다면 각 상수는 문자열이 아닌 정수로 취급된다.
여기서 enum fruit {apple, banana, orange};
일때 apple의 상수값은 0, banana는 1, orange는 2의 값을 갖는다.

값을 따로 지정해주지않으면 첫번째 상수값은 0 다음은1,2,3,....와 같은 형식으로깂을갖게된다.
열거형상수의 가장좋은 예는 월이다.

#include <stdio.h>

int main() {
	
	/* months라는 열거형상수를 선언 */ 
	enum months {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC } mon;
	 
	mon=MAR;
	
	printf("%d\n%d\n", mon, JUN);

	return 0;	
}

실행결과
3
6

만약 위 코드에서 JAN=1 로 시작값을 주지않는다면 0부터 시작하는 열거형상수가 되어
알맞는 월을 출력할수 없다.

#include <stdio.h>

int main() {
	
	/* months라는 열거형상수를 선언하는데 시작값을 안주면 0부터 시작  */ 
	enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC } mon;
	 
	mon=MAR;
	
	printf("%d\n%d\n", mon, JUN);

	return 0;	
}

실행결과
2
5


반응형

'dev' 카테고리의 다른 글

JDBC 실습(JDBC로 select하기)  (0) 2020.08.05
JDBC 개념 및 사용방법  (0) 2020.08.02
입문자를 위한 C언어 기초 구조  (0) 2020.05.16
C언어 개발툴 Dev C++  (0) 2020.05.16
C언어 sprintf  (0) 2020.04.25

댓글