Unit 5. 변수 사용하기
프로그래밍을 하면서 값을 다루려면 변수가 필요하다.
따라서 이번에는 변수를 만들고 변수에 값을 저장하는 방법에 대해 알아보겠다.
C 언어에서는 다음과 같은 형식으로 코드를 입력하여 변수를 만든다.
- 자료형 정수이름;
#include <stdio.h>
int main()
{
int num1; // 정수형 변수 선언
int num2;
int num3;
num1 = 10; // 변수에 값 할당(저장)
num2 = 20;
num3 = 30;
printf("%d %d %d\n", num1, num2, num3); // 10 20 30: 변수에 저장된 값을 %d로 출력
return 0;
}
변수를 만드는 과정(int num1;)을 "변수를 선언한다"라고 부르는데, 변수를 선언할 때는 반드시 맨 뒤에 ; (세미콜론)을 붙여주어야 한다.
* 변수를 선언할 때 파이썬과 차이점이 있는데, C언어는 변수 앞에 반드시 자료형을 써야 한다는 것이다.
변수에 값을 저장할 때는 = (등호)를 사용한다.
변수에 값을 저장하는 과정을 "변수에 값을 할당한다"라고 부른다. 일반적으로 수학에서는 =가 같다는 뜻이지만, C 언어에서는 =를 값을 할당할 때 사용한다.
※ C 언어는 저장할 값의 종류에 따라 자료형이 달라진다.
- char, short, int, long: 정수(저장할 수 있는 크기가 다릅니다)
- float, double: 실수
- void: 형태가 없는 자료형(포인터를 사용할 때, 함수의 반환값을 표현할 때 등 다양하게 사용됌.)
* 변수 여러 개를 한번에 선언하기
변수를 콤마로 구분하여 변수 여러 개를 선언할 수도 있다.
- 자료형 변수1, 변수2, 변수3;
* 변수를 선언하면서 초기화하기
지금까지 변수를 선언한 뒤 다른 줄에서 값을 할당했다. 그러나 변수를 선언하면서 값을 할당(초기화)할 수 있다.
- 자료형 변수 = 값;
- 자료형 변수1 = 값1, 변수2 = 값2;
Unit 6. 디버거 사용하기
버그는 프로그램이 의도하지 않은 동작을 일으키는 것을 말한다.
디버거(debugger)는 버그(bug)를 제거하는(de-) 도구라는 뜻인데 프로그램의 내부 상황을 손쉽게 파악할 수 있어서 버그(문제점)를 찾는데 큰 도움을 준다.
Visual Studio는 C 언어를 컴파일하는 기능뿐만 아니라 디버거(debugger)라는 유용한 기능도 함께 들어 있다.
※ 중단점 사용하기
중단점은 브레이크 포인트(Break Point)라고도 부르는데 소스 코드의 특정 지점에서 프로그램의 실행을 멈추는데 사용한다.
디버거는 이처럼 변수의 내용뿐만 아니라 프로그램의 동작 과정도 손쉽게 알 수 있어서 여러 장점이 있다.
→ Visual Studio 디버거의 단축키
- 중단점 삽입/삭제: F9
- 디버깅 시작: F5
- 디버깅 중지: Shift+F5
- 프로시저 단위 실행: F10
- 한 단계씩 코드 실행: F11
Unit 7. 정수 자료형 사용하기
1. 정수 자료형 사용하기
정수 자료형은 크게 char, int가 있으며 앞에 부호 키워드(signed, unsigned)와 크기(short, long)를 붙여서 특성을 정의한다.
- signed: 부호 있는 정수를 표현함. 보통 signed 키워드는 생략한다.
- unsigned: 부호 없는 정수를 표현함. 따라서 값은 0부터 시작하게 된다.
다음은 부호 있는 정수 자료형으로 변수를 만든 뒤 값을 할당한 것이다. 보통 부호 있는 정수는 signed를 생략한다.
+ 여기서 char는 문자(character)를 뜻하지만 기본적으로 정수형이다.
그리고 printf 함수에서 char, short, int는 서식지정자 %d로 출력하지만 long은 %ld를 사용하고 long long은 %lld를 사용한다.
부호 없는 정수 자료형의 경우 앞에 unsigned키워드를 붙여주면 된다.
2. 오버플로우와 언더플로우
만약 정수 자료형에서 저장할 수 있는 범위를 넘어서면 어떻게 될까?
#include <stdio.h>
int main()
{
char num1 = 128; // char에 저장할 수 있는 최댓값 127보다 큰 수를 할당
// 오버플로우 발생
unsigned char num2 = 256; // unsigned char에 저장할 수 있는 최댓값 255보다 큰 수를 할당
// 오버플로우 발생
printf("%d %u\n", num1, num2); // -128 0: 저장할 수 있는 범위를 넘어서므로
// 최솟값부터 다시 시작
return 0;
}
실행 결과는 다음과 같다.
-128 0
num1에 128을 넣었는데 실제 출력에서는 -128이 나왔다. char에 저장할 수 있는 최댓값은 127이라서 오버플로우(overflow)가 발생했기 때문이다. 즉, 128이 127보다 1이 많아서 저장할 수 있는 범위를 넘어섰고 다시 최솟값부터 시작하게 되므로 -128이 나온다.
마찬가지로 num2도 unsigned char에 저장할 수 있는 최댓값은 255인데 256을 넣으면 범위를 넘어서므로 최솟값인 0부터 다시 시작하게 된다.
char 이외에도 short, int, long, long long 등도 저장할 수 있는 범위를 넘어서면 최솟값부터 다시 시작하게 된다.
반대로 최솟값보다 작아지면 언더플로우(underflow)가 발생하여 최댓값부터 다시 시작하게 된다(값을 계속 뺀다면 최댓값에서 값이 계속 작아짐).
3. 자료형 크기 구하기
sizeof 연산자는 자료형(타입)의 크기를 바이트(byte) 단위로 구한다.
- sizeof 표현식
- sizeof(자료형)
- sizeof(표현식)
#include <stdio.h>
int main()
{
int num1 = 0;
int size;
size = sizeof num1; // 변수 num1의 자료형 크기를 구함
printf("num1의 크기: %d\n", size);
return 0;
}
다음과 같이 sizeof 표현식 형식으로 자료형의 크기를 구할 수 있다.
4. 최솟값과 최댓값 표현하기
소스 코드에서 정수의 최솟값을 표현하려면 limits.h 헤더 파일을 사용해야 한다.
limits.h 헤더 파일에 정의된 정수 자료형의 최소값은 min이 붙어있고, 최대값은 max가 붙어 있다.
limits.h에 정의된 최댓값을 넘어서도 오버플로우가 발생한다. 그리고 마찬가지로 최솟값보다 작아지면 언더플로우가 발생한다.
※ 파이썬과의 차이점 : 파이썬의 경우 수 체계는 정수, 실수 정도로 나누어졌지만 C언어에서는 정수를 바이트 단위, 그리고 부호 등에 따라 char, short, int 등 다양한 정수 자료형이 존재한다.
Unit 8. 실수 자료형 사용하기
1. 실수 자료형 사용하기
다음은 실수 자료형의 크기와 저장할 수 있는 값의 범위다.
※ 부동 소수점 : 컴퓨터에서는 값을 0과 1로 저장한다. 그래서 실수도 0과 1로 저장해야 하는데 이렇게 실수와 소수점을 2진수로 표현하는 방식을 부동소수점 표현 방식이라고 한다. 부동소수점 방식은 자료형의 일정 부분을 비트 단위로 나누어 부호, 가수(significand), 기수(base), 지수(exponent)를 저장하여 실수를 표현한다.
부동소수점은 다음과 같이 기수(n)를 지수(p)만큼 거듭제곱한 값을 가수(m)와 곱하는 방식을 사용한다. 단, 컴퓨터는 값을 저장할 때 2진수로 저장하므로 기수(밑수)는 2로 고정되어 있으며 2 자체는 따로 저장하지 않는다.
부동소수점 저장에 관한 규약은 IEEE 754라는 표준으로 정해져 있는데, 유효 자릿수와 정밀도에 따라 표현 가능한 수가 다르다.
float : 소수점 이하 6자리까지
double : 소수점 이하 15자리까지
-> double 형이 표현할 수 있는 수의 범위가 넓고 정밀도도 높다.(오차가 적다)
2. 실수형 변수 선언하기
#include <stdio.h>
int main()
{
float num1 = 0.1f; // 단정밀도 부동소수점 변수를 선언하고 값을 할당
// float는 숫자 뒤에 f를 붙임
double num2 = 3867.215820; // 배정밀도 부동소수점 변수를 선언하고 값을 할당
// double은 숫자 뒤에 아무것도 붙이지 않음
long double num3 = 9.327513l; // 배정밀도 부동소수점 변수를 선언하고 값을 할당
// long double은 숫자 뒤에 l을 붙임
// float와 double은 %f로 출력, long double은 %Lf로 출력
printf("%f %f %Lf\n", num1, num2, num3); // 0.100000 3867.215820 9.327513
return 0;
}
float의 경우 숫자 뒤에 f, F를 붙여주고, double은 아무것도 붙이지 않는다. 그리고 1.f, .1f처럼 소수점 앞 또는 뒤의 0은 생략할 수 있다.
+float와 double을 printf로 출력할 때는 서식 지정자로 %f를 사용하고, long double을 출력할 때는 %Lf를 사용한다.
3. 최솟값과 최댓값 표현하기
#include <stdio.h>
#include <float.h> // 실수 자료형의 양수 최솟값, 최댓값이 정의된 헤더 파일
int main()
{
float num1 = FLT_MIN; // float의 양수 최솟값
float num2 = FLT_MAX; // float의 양수 최댓값
double num3 = DBL_MIN; // double의 양수 최솟값
double num4 = DBL_MAX; // double의 양수 최댓값
long double num5 = LDBL_MIN; // long double의 양수 최솟값
long double num6 = LDBL_MAX; // long double의 양수 최댓값
printf("%.40f %.2f\n", num1, num2); // 0.0000000000000000000000000000000000000118
// 340282346638528859811704183484516925440.00
printf("%e %e\n", num3, num4); // 2.225074e-308 1.797693e+308
printf("%Le %Le\n", num5, num6); // 2.225074e-308 1.797693e+308
return 0;
}
실수의 경우 float.h 헤더 파일에 각 자료형 별로 양수 최솟값과 최댓값이 정의되어 있다.
4. 오버플로우와 언더플로우 알아보기
정수 자료형과 마찬가지로 실수 자료형도 오버플로우와 언더플로우가 발생할 수 있다.
#include <stdio.h>
#include <float.h> // 실수 자료형의 양수 최솟값, 최댓값이 정의된 헤더 파일
int main()
{
float num1 = FLT_MIN; // float의 양수 최솟값
float num2 = FLT_MAX; // float의 양수 최댓값
// float의 양수 최솟값을 100000000.0으로 나누면 아주 작은 수가 되면서 언더플로우 발생
num1 = num1 / 100000000.0f;
// float의 양수 최댓값에 1000.0을 곱하면 저장할 수 있는 범위를 넘어서므로 오버플로우 발생
num2 = num2 * 1000.0f;
printf("%e %e\n", num1, num2); // 0.000000e+00 inf: 실수의 언더플로우는 0
// 오버플로우는 무한대가 됨
return 0;
}
FLT_MIN을 100000000.0과 같이 큰 수로 나누면 아주 작은 수가 되면서 언더플로우가 발생하는데 C 언어에서는 실수 언더플로우를 0 또는 쓰레기 값으로 처리한다.
반대로 FLT_MAX에 1000.0을 곱하면 저장할 수 있는 범위를 넘어서기 때문에 오버플로우가 발생한다. 정수와는 달리 실수는 오버플로우가 발생했을 때 최솟값으로 되돌아가지 않고 무한대(infinity)가 되므로 inf가 출력된다.
※ 파이썬과의 차이점 : 실수형 자료형 역시 파이썬에서는 한가지로 존재했지만, C언어에서는 부동소수점 방식에 따라 float/double/long doblue 형으로 나눠진다.
'Programming Languages > C' 카테고리의 다른 글
[P4C] C 언어 코딩 도장 : 문제 풀이2 (0) | 2021.02.18 |
---|---|
[P4C] C언어 코딩 도장 : UNIT 12 ~ UNIT 16 (0) | 2021.02.17 |
[P4C] C언어 코딩 도장 : UNIT 9 ~ UNIT 11 (0) | 2021.02.17 |
[P4C] C 언어 코딩 도장 : 문제 풀이 (0) | 2021.02.15 |
[P4C] C언어 코딩 도장 : UNIT 1 ~ UNIT 4 (0) | 2021.02.15 |