C언어 lec

모기·2025년 4월 17일

C는 하드웨어 친숙한 언어다!

C언어는 시스템 프로그래밍을 하기 때문에 메모리를 최대한 아껴야한다.
따라서 다양한 데이터 타입이 있다.
이렇게 메모리를 아끼는 것이 시스템 프로그래밍 언어 대부분들의 특징이다.

또한
아키텍처에 따라 데이터의 크기는 변할 수 있다.
즉, 32bit, 64bit을 쓰느냐에 따라 int형 데이터의 byte 수가 달라질 수 있다.
따라서 C프로그래밍을 할 때는 사이즈를 확인하는 것이 중요하다.
#<stdin.h>는 standard int 즉, 인트형을 고정시켜서 사용한다.

C는 어려운 언어다!

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가 할당돼있다고 할 때

메모리 주소100101102103
데이터0004

int* p = 100
char* q = 100
이라고하면
*p = 4이고 *q = 0(NULL)을 출력한다.

profile
안녕

2개의 댓글

comment-user-thumbnail
2025년 4월 18일

아키텍쳐에 따라 데이터의 크기가 변한다면 C로 작성된 동일한 코드가 컴파일 단계에서 자동으로 아키텍쳐에 맞는 해당크기를 나타내는 어셈블리코드로 변환된다는 건가요? 그렇다면 stdiio.h에 선언되어있는 typedef int32_t int_fast32_t는 어떠한 경우에 사용되는 것 인가요?

1개의 답글