들어가며
일요일에 달리기를 하면서 무리가 왔던 왼쪽 발바닥이 아직도 아프다 ㅜㅜ.
비골근염? 이라는 이름의 무언가 같은데, 족저근막염이랑은 또 다른 염증질환인가봄. 우선은 소염진통제로 버티고 있는데, 한 목요일 정도까지 경과를 보고 병원을 방문하던지 해야겠다.
이제 일상의 패턴을 좀 만들어야 하는데, 크로스핏 끝나고 바로 출발하면 제시간안에 들어올 수 있을지 한 번 테스트를 좀 해봐야할 것 같다. 우선 발 좀 낫고…
오늘의 키워드
Expression과 Statement
C언어에 있는 모든 연산자는 Expression이다. 의외로 C에서도 대입연산자 = 는 expression이였다.
대입 연산자는 Expression이다. 아래처럼 = 대입 연산자와 += 대입 연산자 둘 다 expression으로 사용할 수 있다. C에서도 이렇게 식 중간에 대입을 수행할 수 있다.
int a = 5;
int b = 3;
int res;
res = (a > (b=7)) ? a : b;
res = (a > (b+=7)) ? a : b;
콤마 연산자 , 또한 Expression이다. 이렇게 코드 실행을 쓸 수 있는 건 처음 알았다. 아마도 작업 후 Wrap-up을 위한 코드를 이렇게 작성하면 좋을 것 같음. (메모리 할당 작업 이후 해제 작업 등?
like finally
)
void func1() {
printf("hello, ");
}
void func2() {
printf("world!\n");
}
int newFunction() {
// func1 실행 -> func2 실행 -> 5 반환
return (func1(), func2(), 5);
}
괄호를 잘 쓰자
괄호는 쓰더라도 컴파일 과정에서 걸러져서 성능상에 영향을 주지 않는다.
연산 우선순위에 대한 가독성을 높이기 위해서 적절하게 잘 활용하자.
특히 연산자간의 우선순위 (bit 연산자 / +- 연산자 / << >> 연산자 등)의 우선순위가 헷갈림. 자주 확인해주기!
정수, 실수의 승격
어제 마주쳤던 의심스러운 sizeof 동작이 기능이었다는걸 알게되었다.
int main(void) {
// 정수인데 int보다 작은 사이즈면 다 4byte(int size)로 맞춰서 전달
// 실수인데 double보다 작은 사이즈면 다 8byte(double size)로 맞춰서 전달
char x = 127;
char y = x + 1;
printf("x = %d, x + 1 = %d, y = %d\n", x, x + 1, y);
printf("sizeof / x = %d, x + 1 = %d, y = %d\n", sizeof(x), sizeof(x + 1), sizeof(y));
printf("\n");
float ff = 100.5;
float gg = ff + 0.5;
printf("ff = %f, ff + 0.5 = %f, gg = %f\n", ff, ff + 0.5, gg);
printf("sizeof/ff = %d, ff + 0.5 = %d, gg = %d\n", sizeof(ff), sizeof(ff + 0.5), sizeof(gg));
printf("\n");
// 근데 float + int 연산을 할 때는 1이 float가 되어서 4byte로 연산됨
// 요거슨 4byte + 4byte라 그런 것 같음
float f = 100.01;
float g = f + 1;
printf("f = %f, f + 1 = %f, g = %f\n", f, f + 1, g);
printf("sizeof/f = %d, f + 1 = %d, g = %d\n", sizeof(f), sizeof(f + 1), sizeof(g));
printf("\n");
return 0;
}
/// 실행결과
x = 127, x + 1 = 128, y = -128
sizeof / x = 1, **x + 1 = 4**, y = 1
ff = 100.500000, ff + 0.5 = 101.000000, gg = 101.000000
sizeof/ff = 4, **ff + 0.5 = 8**, gg = 4
f = 100.010002, f + 1 = 101.010002, g = 101.010002
sizeof/f = 4, **f + 1 = 4**, g = 4
연산 결과를 변수에 넣고나면 다시 float로 크기가 돌아온다. 리터럴을 이용하는 연산 중에는 정수는 최소 4byte / 실수는 최소 8byte로 변환되어 수행된다는 것이 승격.
다만 실행결과를 보면 float + 1의 타입은 float 이지만, float + 0.5의 타입은 double임을 볼 수 있다. float + int 에서는 굳이 double로 형변환을 할 필요가 없기 때문인 듯 하다.
그리고, 여기에 대한 승격 규칙도 있다!
[승격 규칙]
long double (최상위)
↑
double
↑
float
↑
unsigned long
↑
long ⇒ 4byte
↑
unsigned int
↑
int (하위) ⇒ 찾아보니 2byte or 4byte / 현재 컴파일러에서는 4byte
↑
이 아래에 있는 것들은 signed int로 변환되어 처리됨!
int보다 작으면 int로 변환되어 처리되기에, char + char는 int로 변환되어 처리됨
📌 유의사항
signed → unsigned 으로 변환한다고 하더라도 padding은 signed bit으로 채워짐
⇒ char 0xF0 을 unsigned int로 변환한다고 하더라도 0xFFFFFFF0 이 된다. 그래서 무지막지하게 큰 수로 읽힘.
근데 unsigned → signed 변환에서는 padding이 0이 붙음!
'TIL' 카테고리의 다른 글
| [250819] Day 9 - 개인교사 데뷔전 (0) | 2025.08.20 |
|---|---|
| [250818] Day 8 - 알고리즘 재활치료 시작 (3) | 2025.08.18 |
| [250814] Day 4 - 포인터지옥 벌써 시작 (7) | 2025.08.15 |
| [250813] Day 3 - 날씨 최고로 좋다~ (3) | 2025.08.13 |
| [250811] Day 1 - 텔레칩스 임베디드 스쿨 ON / C언어 포인터 (2) | 2025.08.11 |