1. 변수
1. 변수의 정의
: 변수란, 프로그램에서 값들이 저장되는 공간을 변수라고 한다.
2. 변수의 선언
: 변수는 반드시 사용하기 전에 미리 선언을 해야한다.
자료형 변수이름 = 초기값;
int num = 0;
char alpha = 'a';
3. 변수의 명명법 ★★★
- 알파벳 문자와 숫자, 밑줄 문자로 이루어진다.
- 이름의 중간에 공백이 들어가면 안된다.
- 첫 번째 문자는 반드시 알파벳 또는 밑줄 문자이어야한다. (숫자를 첫 번째 문자로 사용은 불가능)
- 대문자와 소문자를 구분하여 서로 다른 것으로 취급한다. 따라서, 변수 index와 Index, INDEX는 서로 다른 변수이다.
- C언어에서 사용하고 있는 키워드(예약어)와 똑같은 이름은 허용되지 않는다.
4. 변수의 초기화
변수를 초기화시키지 않으면?
☞ 변수가 어디서 선언되는지에 따라 다르지만, 일반적으로 초기화되지 않은 변수에는 쓰레기 값이 들어가게 된다.
2. 자료형
: 자료형에는 정수형, 부동소수점형, 문자형이 있다.
자료형 | 바이트 수 | |
정수형 | short | 2 |
int | 4 | |
long | 4 | |
long long | 8 | |
문자형 | char | 1 |
부동 소수 점형 | float | 4 |
double | 8 | |
long double | 8 |
3. sizeof 연산자
: 자료형의 크기를 알아보기 위해서 사용하는 것
int x;
printf("변수 x의 크기: %d\n", sizeof(x)); // 변수 X의 크기: 4
printf("char의 크기: %d\n", sizeof(char)); // char의 크기: 1
printf("int의 크기: %d\n", sizeof(int)); // int의 크기: 4
4. unsigned
: unsigned는 변수가 음수가 아닌 값만을 나타낸다는 것을 의미한다. (0포함)
여기서 unsigned로 선언된 변수에 음수를 넣으면 실제로 저장되는 값은 2의 보수 표현에서 모든 비트가 1인 값, 즉 최대값이 된다. 32비트 기준으로는 4294967295가 저장됩니다.
하지만 %d로 출력을 하면 그대로 -1이 출력이 되고, %u로 출력을 하면 4294967295이 출력이 된다.
5. 정수에서의 오버 플로우와 언더 플로우
: 정수형 변수가 표현할 수 있는 최대값(최소값)을 넘는 값을 저장하려고 할 때 발생하는 현상이다.
[오버 플로우]
부호 있는 정수형에서 최대 값을 넘기면 음수의 최솟값이 나온다.
[부호가 있는 정수형에서의 오버 플로우]
#include <stdio.h>
int main() {
int max = 2147483647; // int의 최대값
printf("Max int: %d\n", max);
max = max + 1; // 최대값을 초과
printf("Overflow int: %d\n", max); // 예상치 못한 값 출력
return 0;
}
----------------------------
Max int: 2147483647
Overflow int: -2147483648
----------------------------
부호 없는 정수형에서 최대 값을 넘기면 0이 나온다.
[부호가 없는 정수형에서의 오버 플로우]
#include <stdio.h>
int main() {
unsigned int max = 4294967295; // unsigned int의 최대값
printf("Max unsigned int: %u\n", max);
max = max + 1; // 최대값을 초과
printf("Overflow unsigned int: %u\n", max); // 0 출력
return 0;
}
-----------------------------------
Max unsigned int: 4294967295
Overflow unsigned int: 0
-----------------------------------
[언더 플로우]
부호 있는 정수형에서 최소 값을 넘기면 양수의 최대 값이 나온다.
[부호가 있는 정수형에서의 언더 플로우]
#include <stdio.h>
int main() {
int min = -2147483648; // 32비트 정수의 최솟값
min = min - 1; // 언더플로우 발생
printf("%d\n", min); // 출력: 2147483647 (양수의 최대값)
return 0;
}
부호 없는 정수형에서 최대 값을 넘기면 부호 없는 양수의 최대 값 이 나온다.
[부호가 없는 정수형에서의 언더 플로우]
#include <stdio.h>
int main() {
unsigned int min = 0; // 32비트 부호 없는 정수의 최솟값
printf("Before underflow: %u\n", min); // 최솟값 출력
min = min - 1; // 언더플로우 발생
printf("After underflow: %u\n", min); // 최대값이 출력됨
return 0;
}
---------------------------
Before underflow: 0
After underflow: 4294967295
---------------------------
6. 실수에서 오버플로우 언더 플로우
: 정수형 변수가 표현할 수 있는 최대값(최소값)을 넘는 값을 저장하려고 할 때 발생하는 현상이다.
[오버 플로우]
부호 있는 실수형에서 최대 값을 넘기면 양의 무한대(∞)가 나온다.
[부호가 있는 실수형에서의 오버 플로우]
#include <stdio.h>
int main() {
float large = 3.4e38; // float의 최대값에 가까운 값
large = large * 1000; // 오버플로우 발생
printf("%f\n", large); // 출력: inf (무한대)
return 0;
}
부호 없는 정수형에서 최대 값을 넘기면 0이 나온다.
[부호가 없는 살수형에서의 오버 플로우]
#include <stdio.h>
int main() {
unsigned int max = 4294967295; // unsigned int의 최대값
printf("Max unsigned int: %u\n", max);
max = max + 1; // 최대값을 초과
printf("Overflow unsigned int: %u\n", max); // 0 출력
return 0;
}
-----------------------------------
Max unsigned int: 4294967295
Overflow unsigned int: 0
-----------------------------------
오버플로우와 언더플로우를 방지하기 위해서는 어떻게 해야할까?
1. 범위 검사
: 연산 전에 값이 최대 값에 도달하는지 확인하여, 최대값을 넘은 연산을 방지한다.
2. 더 큰 자료형 사용
: 현재 자료형이 다룰 수 없는 큰 값을 처리해야할 때, 더 큰 자료형을 사용한다.
3. 조건부 연산 사용
: 값이 최대값에 도달하는지 확인하고 그에 따라 안전하게 연산을 수행한다.
7. 입출력 형식 지정자
정수형에서 형식 지정자 ★★★
자료형 | 형식 지정자 | 설명 |
short | %hi | 입력할 때는 %hi를 사용하는 것이 좋다. 출력은 %d도 가능하다. |
int | %d | |
long | %ld | |
long long | %lld | 특히 입력할 때는 반드시 %lld를 사용하여야 한다. 출력도 마찬가지! |
부동 소수점형에서 형식 지정자 ★★★
자료형 | 형식 지정자 |
float | %f |
double | %lf |
long double | %Lf |
부동 소수점형 형식 지정자 N.f와 .Nf를 사용해서 소수를 출력한다면
- N.f는 소수점은 버리고, 정수부분만 N 자리를 맞춰서 출력한다.
- . Nf는 소수점 N자리까지만 출력한다.
#include <stdio.h>
int main() {
float value = 10.12345;
printf("%4.f\n", value); // 소수점 없이 최소 4자리 출력 -> 10
printf("%.4f\n", value); // 소수점 이하 4자리까지 출력 -> 10.1234
return 0;
}
8. 16진수
9. 기호상수
: 상수에 이름을 붙인 것이다.
장점
1. 가독성 향상
: 숫자나 특정 값을 바로 사용하는 대신 의미 있는 이름을 사용하면 가독성이 올라간다.
2. 유지보수 용이
: 상수 값을 변경할 때 한 곳에서만 값을 수정하면 된다.
3. 재 사용성
: 같은 값을 여러번 사용해야할 때 하나의 상수로 재사용할 수 있다.
10. 1과 '1'의 차이
: 1은 정수이고, '1'은 문자 '1'을 나타내는 아스키코드이다.
11. 제어 문자★★★
: 출력 목적이 아닌, 제어 목적으로 사용되는 문자들
사용법
#include <stdio.h>
int main() {
printf("\제어문자"); //
return 0;
}
제어 문자 이름 | 제어 문자 표기 | 값 | 의미 |
경고(bell) | \a | 7 | '삐'하는 경고 벨소리 발생 |
줄바꿈 | \n | 10 | 커서를 다음 라인의 시작 위치로 옮긴다. |
큰따옴표 | \" | 34 | 원래의 큰 따옴표 자체 |
작은따옴표 | \' | 39 | 원래의 큰 따옴표자체 |
역슬래시 | \\ | 92 | 원래의 역슬래시 자체 |
12. getchar()
: getchar()는 공백문자, 줄바꿈 문자도 받아드려서, 만약 getchar()를 사용한다면 getchar()를 사용해서 공백문자, 줄바꿈 문자를 없애고 입력을 받아야한다.