C언어는 시스템 프로그래밍을 하기 때문에 메모리를 최대한 아껴야한다.
따라서 다양한 데이터 타입이 있다.
이렇게 메모리를 아끼는 것이 시스템 프로그래밍 언어 대부분들의 특징이다.
또한
아키텍처에 따라 데이터의 크기는 변할 수 있다.
즉, 32bit, 64bit을 쓰느냐에 따라 int형 데이터의 byte 수가 달라질 수 있다.
따라서 C프로그래밍을 할 때는 사이즈를 확인하는 것이 중요하다.
#<stdin.h>는 standard int 즉, 인트형을 고정시켜서 사용한다.
if (x=y)
foo();
C는 여기서 에러를 띄우지 않는다.
y를 x에 할당하고 x값에 따라 함수를 출력한다.
y = x/*p
포인터 역참조 값으로 나누는 게 아니고 주석 처리를 해버린다.
이걸 해결하기 위해선 괄호를 사용해야 한다.
y = x/(*P)
원하는 의도대로 식을 계산하기 위해 괄호를 항상 사용하자!
*p++ 연산은 어떻게 해석될까?
의도는 무엇인지 모르지만,
*(p++)이 될 수도 있고, (*p)++로 해석될 수도 있다.
결국 소스 코드는 다른 사람에게 보여지기 위해 작성하는 것이므로
반드시 가독성 좋게 코딩하자.
if ();
foo();
은 if 문을 확인만 하고 foo()를 실행해버린다.
따라서 bracket을 쓰자
if () {
foo();
}
swich/case 문에서 break; 실수
short curcuit
&& 연산에서 앞 조건이 False이면 뒤의 값을 계산하지 않고 실행하지 않음.
|| 연산에서 앞 조건이 True이면 뒤의 값을 계산하지 않고 실행.
i = 0;
while (i < n)
y[i++] = x[i];
위 문법은 의미가 명확하지 않고 컴파일러가 해당 구문을 어떻게 해석하느냐에 따라 다른 결과가 도출된다.
biggest = max(biggest, x[i++]);
(max는 매크로다)
biggest = ((biggest)>(x[i++])?(biggest):(x[i++]));
와 같이 바뀌게 되며 i++이 두 번 발생할 수 있다.
다음과 같은 메모리 주소에
int로 4가 할당돼있다고 할 때
| 메모리 주소 | 100 | 101 | 102 | 103 |
|---|---|---|---|---|
| 데이터 | 0 | 0 | 0 | 4 |
int* p = 100
char* q = 100
이라고하면
*p = 4이고 *q = 0(NULL)을 출력한다.
아키텍쳐에 따라 데이터의 크기가 변한다면 C로 작성된 동일한 코드가 컴파일 단계에서 자동으로 아키텍쳐에 맞는 해당크기를 나타내는 어셈블리코드로 변환된다는 건가요? 그렇다면 stdiio.h에 선언되어있는 typedef int32_t int_fast32_t는 어떠한 경우에 사용되는 것 인가요?