ダメなコード

デフォルトって?

ありがちダメなコードのダメな理由を書くコーナー。 char const* getNameFromID(int id) { switch (id) { case ID_FOO: return "FOO"; case ID_BAA: return "BAA"; default: return "TEST"; } }ID_FOOを受け取った場合に"FOO"、ID_BAAを受け取った場合に"BAA…

エラー握りつぶし

ありがちダメなコードのダメな理由を書くコーナー。 #include <stdlib.h> #include <math.h> #include <stdio.h> int mysqrt(int x) { if (x < 0) { return 0; } else { return (int)sqrt(x); } } int main() { printf("%d\n", mysqrt(4)); printf("%d\n", mysqrt(1)); printf("%d\n", m</stdio.h></math.h></stdlib.h>…

名前がおかしい。

extern int checkStatus(void);static int status; int checkStatus() { status = !status; return status == 0; }間違っている点は 宣言と定義の返り値が違う。enum型の大きさがintとは限らない。 宣言と定義の仮引数リストが違う。 check〜という名前にも…

引数の評価順序。

ありがちダメなコードのダメな理由を書くコーナー。 現象。 #include <stdlib.h> #include <stdio.h> int main() { printf("puts(\"A\"), puts(\"B\"), puts(\"C\")+puts(\"D\") = %d, %d, %d\n", puts("A"), puts("B"), puts("C")+puts("D")); return 0; }をコンパイルして実行</stdio.h></stdlib.h>…

副作用のタイミング

ありがちダメなコードのダメな理由を書くコーナー。 現象。 C99のソースコード(tmp.c) #include <stdlib.h> #include <stdio.h> int main() { int i = 0; printf("(++i) + (++i) = %d\n", (++i) + (++i)); return 0; }をコンパイルして実行すると、 $ gcc -std=c99 -pedantic -O</stdio.h></stdlib.h>…

マルチスレッドのvolatile

ありがちダメなコードのダメな理由を書くコーナー。 現象。 C99+POSIX(SUSv3)のソースコード(tmp.c) #include <stdlib.h> #include <stdio.h> #include <pthread.h> volatile int count = 0; int const COUNT_PER_THREAD = 0x100000; int const THREAD_NUM = 0x10; void* work(void* arg) {</pthread.h></stdio.h></stdlib.h>…