<limit.h> CHAR_BIT
<limit.h> CHAR_MIN
<limit.h>
헤더파일에서, CHAR_MIN를 보면, 부호 식별자가 없은 char
가 singed ? unsigned ? 알 수 있다.0 ~ 4294697295
-2147483648 ~ 2147483647
int signed_int = -1024;
unsigned int unsigned_int1 = 394;
unsigned int unsigned_int2 = 2147483648; <---- 경고 나옴 signed int 범위 벗어남 (unsigned int 로 해도)
unsigned int unsigned_int3 = 2147483648u; <---- 경고 없음, 대문자 U 도 가능
long
: 최소 32bit && int 이상의 크기 (....)-2147483647 ~ 2147483647
long signed_long = -200000000l; <--- 대문자 L도 가능
unsigned long unsigned_long1 = 2147483647;
unsigned long unsigned_long2 = 2147483648; <---- 경고 나옴 signed long 범위 벗어남 (unsigned long 로 해도)
unsigned long unsigned_long3 = 2147483648ul; <---- 경고 없음
l
|| L
: long을 의미하는 접미사u
|| U
: 부호 없는(unsigned) 수를 표현하는 접미사2147483648UL
2147483648lu
2147483648LU
2147483648ul
type | 최소 | 보통 |
---|---|---|
char | 최소 8bit | 보통 8bit |
short | 최소 16bit | 보통 16bit |
int | 최소 16bit | 보통 32bit |
long | 최소 32bit | 보통 32bit |
float num = 3.14f; <--- F도 가능
float num = 3.0f;
float num = 3.f;
double num = 3.4;
long double num = 3.14;
float
, double
은 플랫폼 사이에 값이 정확히 일치하지 않을 수 있음0
이면 false
!= 0
이면 true
int -> enum
enum -> int
enum -> enum
우선순위 | 연산자 |
---|---|
1 | ++ -- 후위 증감() 함수 호출[] 배열 첨자. 구조체, 공용체 멤버 접근자-> 구조체, 공용체 멤버 접근자(포인터) |
2 | ++ -- 전위 증감 연산자+ - 단항 연산자! 논리 부정 연산자~ bit 부정 연산자(자료형) 자료형 캐스팅 * 역 참조(혹은 간접참조)& 주소sizeof 피연산자의 크기를 알려주는 연산자 |
3 | * / % 곱하기, 나눗셈 (몫), 나눗셈(나머지) |
4 | + - 덧셈 뺄셈 |
5 | << >> 왼쪽/오른쪽 비트 이동 연산자 |
6 | < <= 비교연산자> >= 비교연산자 |
7 | == != 비교 연산자 |
8 | & 비트 AND 연산자 |
9 | ^ 비트 XOR 연산자 |
10 | | 비트 OR 연산자 |
11 | && 논리 AND 연산자 |
12 | || 논리 OR 연산자 |
13 | ?: 삼항 연산자 (연산자 결합법칙 <- ) |
14 | =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, \= |
15 | , |
&&
, ||
는 평가 순서를 강제함&&
, ||
의 경우 왼쪽 연산자를 먼저 실행hp++
|| mp++
exp++
&& atk++
sizeof()
char ch = 'a';
int num = 100;
char char_array[30];
size_t size_char = sizeof(ch); /* 1 */
size_t size_int = sizeof(num); /* 4 */
size_t size_float = sizeof(float); /* 4 */
size_t size_array = sizeof(char_array); /* 30 */
const size_t num_vals = sizeof(values) / sizeof(values[0]);
/* 함수 밖에서*/
#define ARRAY_LENGTH(arr) (sizeof(arr) / sizeof(arr[0]))
/* 매크로 함수 사용*/
const size_t num_vals = ARRAY_LENGTH(values);
int func(int num, int data[]);
int main(void)
{
int score; /* 10 */
int values[3]; /* { 2, 3, 4} */
do_func(score, values);
}
void func(size_t n, int data[])
{
size_t i;
for(i=0; i<n; i++){
data[i] = data[i]++;
}
size_t
size_t
: 부호 없는 정수형의 상수, 즉 실제 데이터형은 아님_t
: typedef를 했다는 힌트vcruntime.h
#ifdef WIN64
typedef unsigned int64 size_t; <--- 64bit 운영체제일 경우 unsigned __int64 (64bit)
typedef __int64 ptrdiff_t;
typedef __int64 intptr_t;
#else
typedef unsigned int size_t; <-- 그외 운영체제일 경우 unsigned int (32bit)
....
size_t
의 크기를 딱히 명시하지 않음typedef unsigned int size_t;
size_t
의 용도int int_array[30];
size_t i;
for (i = 0; i < 30; ++i) {
int_array[i] = i;
}
for (size_t = 0; i<30; ++i) {
int_array[i] = (int)i;
}
size_t checker(const char* name){
if(!조건){
return (size_t)-1;
}
return 0;
}
int
, char
, enum
)만 가능const char* name = "Banana";
switch (name) {
case "Apple": <-- 오류!
}
case
안에서 break가 없다면?switch
문을 곧바로 탈출하지 않고 그 아래 있는 코드 실행case
, default
레이블에 있는 코드switch
블록의 끝에 도착하면 탈출enum fruit { FRUIT_APPLE, FRUIT_MANGO };
enum fruit fruit = FRUIT_APPLE;
switch (fruit) {
case FRUIT_APPLE:
printf("Breakfast\n"); <--- 실행 후
/* internal fallthrough */ <--- 의도적 break;를 사용하지 않은 경우 옆 주석을 꼭 붙이자!
case FRUIT_MANGO:
printf("Lunch\n"); <--- fallthrough로 아래 실행
break;
default:
printf("Unknown food\n");
break;
}
int sum=0;
for(size_t i=0; i<10; ++i){
sum+=i;
}
gcc -std=89 -W -Wall -pedantic-errors main.c -o main
변수타입 | 서식 지정자 |
---|---|
int | %d |
unsigned int | %u |
long | %ld |
unsigned long | %lu |
long long | %lld |
unsigned long long | %llu |
size_t | %zu |
ssize_t | %zd |