Logic and Program Flow Mistakes
Forgetting break after case
int flag = 1; // Will print all three lines. switch (flag) { case 1: printf("I'm printed\n"); case 2: printf("Me too\n"); case 3: printf("Me three\n"); }
위의 코드와 같이 case statement를 break로 구분지어 주지 않으면 다음 statement로 continue됩니다. 즉 flag가 2 이면 case 2와 case 3이 모두 실행됩니다. 수정한 코드는 다음과 같습니다.
int flag = 1; // Will print only "I'm printed\n" switch (flag) { case 1: printf("I'm printed\n"); break; case 2: printf("Me too\n"); break; case 3: printf("Me three\n"); break; //unnecessary }
이 때 마지막 case3에서 더 이상의 케이스가 없기 때문에 break문은 불필요합니다.
Assignment vs Equality Check
int answer = 3; // Will print out the answer. if (answer = 42) { printf("I've solved the answer! It's %d", answer); }
컴파일러는 위와 같은 실수에 warning을 해줄 수도 있습니다. 위와 같은 코드는 if문 안에서 answer의 assignment가 일어나 42가 출력될 것입니다.
if 안에 의도된 assign이라 warning을 제거하고 싶다면 하나의 괄호쌍을 더 추가하면 warning이 사라집니다.
ssize_t x; if ( (x = read(somefd, somebuf, somenum)) ){ // do something }
Undeclared or Incorrectly Prototype Functions
#include <stdio.h> int main(void){ int start = time(); printf("%d\n", start); }
library call인 time은 시간을 가질 time_t structure를 파라미터를 가지고 있습니다. 하지만 위의 예제에서 time함수의 원형이 선언되어 있는 time.h를 include하지 않았기 때문에 컴파일러가 위의 에러를 잡지 못할수도 있습니다.
이러한 이유로, C99부터는 선언되지 않은 함수를 호출하는 것은 금지되었습니다.
Extra semicolons
int i; for (i = 0; i < 5; i++);{ printf("I'm printed once\n"); } while (i < 10); // program goes into infinite loop i++; // this code is never executed
위와 같은 예제에서 for문 뒤에 ;이 붙음으로써 이 반복문은 아무것도 하지 않고 5번이 반복됩니다. 그 후에 printf가 한번만 호출됩니다.
다음 while문에서는 1을 증가시키지 않고 계속 반복하고 있으므로 무한 루프에 빠지게 됩니다.
반면 일반적으로 세미콜론을 여러개 붙이는 경우는 허용됩니다. 컴파일러가 이 semicolon을 무시하기 때문입니다. 또한 아래와 같이 for문의 조건에서 초기화와 증가 조건이 필요하지 않다면 아무것도 쓰지 않을수도 있습니다.
int i = 0; for (; i++ < 5;) { // i=1,2,3,4,5 printf("%d\n", i);;;;;;;;;;;;; }
'Angrave System Programming > Learning C' 카테고리의 다른 글
Strings and Structs(1) (0) | 2019.01.09 |
---|---|
Common Gotchas(3) (0) | 2019.01.09 |
Common Gotchas(1) (0) | 2019.01.09 |
Text Input And Output(2) (0) | 2019.01.08 |
Text Input And Output(1) (0) | 2019.01.08 |