혼자 공부하는 C언어
책의 2장(상수와 데이터 출력), 3장(변수와 데이터 입력), 4장(연산자)을 읽고 간단한 백준 문제들을 풀면서 정리해보았다.
#include <stdio.h>
int main(void)
{
char ch;
scanf("%c", &ch); // 주소 연산자 & 붙이기
printf("%d\n", ch); // 문자를 정수로 출력
return 0;
}
&
) 붙이기&
(앰퍼샌드)는 변수의 주소를 구하는 연산자이다.&
를 붙여야 한다.#include <stdio.h>
int main(void)
{
unsigned long a, b, c;
scanf("%lu%lu%lu", &a, &b, &c);
printf("%lu\n", a + b + c);
return 0;
}
unsigned
정수 자료형을 사용했다.unsigned int
형으로 했더니 통과가 안 되어서 더 큰 값을 저장할 수 있는 unsigned long
형으로 바꾸었더니 통과되었다.자료형 | 크기 | 값의 저장 범위 | 출력 변환 문자 |
---|---|---|---|
char | 1 Byte | -128 ~ 127 | %c |
int
형을 기본적으로 사용한다.sizeof
연산자로 확인할 수 있다.자료형 | 크기 | 값의 저장 범위 | 출력 변환 문자 |
---|---|---|---|
char | 1 Byte | -128 ~ 127 | %d |
short | 2 Byte | -32,768 ~ 32,767 | %hd |
int | 4 Byte | -2,147,483,648 ~ 2,147,483,647 | %d |
long | 4 Byte | -2,147,483,648 ~ 2,147,483,647 | %ld |
long long | 8 Byte | -(2^63) ~ (2^63)-1 | %lld |
signed
로 선언되어 양수와 음수를 모두 저장한다.unsigned
를 사용해서 양수만 저장하면 두 배 더 넓은 범위의 값을 저장할 수 있다.자료형 | 크기 | 값의 저장 범위 | 출력 변환 문자 |
---|---|---|---|
unsigned char | 1 Byte | 0 ~ 255 | %u |
unsigned short | 2 Byte | 0 ~ 65,535 | %hu |
unsigned int | 4 Byte | 0 ~ 4,294,967,295 | %u |
unsigned long | 4 Byte | 0 ~ 4,294,967,295 | %lu |
unsigned long long | 8 Byte | 0 ~ (2^64)-1 | %llu |
double
형을 기본적으로 사용한다.자료형 | 크기 | 값의 저장 범위 | 출력 변환 문자 |
---|---|---|---|
float | 4 Byte | -3.4e-38 ~ 3.4e+38 | %f |
double | 8 Byte | -1.7e-308 ~ 1.7e+308 | %lf |
long double | 8 Byte 이상 | double형과 같거나 큰 범위 | %Lf |
#include <stdio.h>
int main(void)
{
unsigned int a, b, sum, product, quotient, remainder;
int difference;
scanf("%u%u", &a, &b);
sum = a + b;
difference = a - b;
product = a * b;
quotient = a / b;
remainder = a % b;
printf("%u\n%d\n%u\n%u\n%u\n", sum, difference, product, quotient, remainder);
return 0;
}
unsigned int
자료형을 사용했다./
) 연산자로 몫을 구하고, 나머지(%
) 연산자로 나머지를 구할 수 있다. (실수 자료형을 나머지 연산자로 연산하려고 하면 에러가 발생한다.)signed int
자료형으로 선언했다.unsigned
로 저장할 때는 항상 양수만 저장하고 %u
로 출력하세요!그 이유는?
%d
는 가장 왼쪽 비트를 부호 비트로 간주하여 10진수로 출력하고, %u
는 부호 비트를 고려하지 않고 모든 비트를 10진수로 바꿔 출력한다.%d
변환 문자는 -1을 출력하고, %u
변환 문자는 4294967295를 출력한다.따라서 변환 문자 unsigned
형 변수에 음수를 저장하거나, 큰 양수를 저장하고 %u
가 아니라 %d
로 출력할 경우 결과값이 예상과 달라질 수 있다.
#include <stdio.h>
#include <string.h>
int main(void)
{
char word[101];
scanf("%s", word); // 배열명에 주소 연산자(&) 붙이지 않음
printf("%ld\n", strlen(word));
return 0;
}
&
)를 붙이지 않는다.=
)로 문자열을 입력할 수 없다!word = "apple";
← 이런 식으로 대입 불가능)\0
)를 자동으로 추가한다.char
배열 크기는 101로 만들었다.sizeof
vs strlen
처음에는 sizeof
연산자로 단어 길이를 구하려고 했다. 그런데...
printf("%ld\n", sizeof(word)); // word 변수의 메모리 할당 크기인 101 출력
뭘 입력하든 항상 101이 출력되는 것이었다! 입력받은 문자열 끝에 있는 널 문자와는 상관 없이 sizeof
연산자는 항상 char 배열을 초기화할 때 할당한 크기인 101을 반환했다.
찾아봤더니 strlen
함수를 사용하면 널 문자 전까지 문자열의 길이를 구할 수 있었다. strlen
함수를 사용하기 위해서는 소스 코드에 string.h
헤더 파일을 포함시켜야 한다.
정리:
sizeof
연산자는 메모리 할당 크기로, 피연산자의 크기를 바이트 단위로 계산한다.strlen
함수는 문자열의 끝 널 문자(\0
)를 만나기 전까지 문자의 개수를 센다.