昔、フォーラムで興味深い質問を見つけました。その答えを知りたいのですが。
次のC関数を考えます。
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
これは常にfalse
から戻るはずvar3 == 3000
です。main
この関数は次のようになります。
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
f1()
は常にを返すのでfalse
、プログラムはfalseを1つだけ画面に出力すると予想します。しかし、コンパイルして実行すると、executedも表示されます。
$ gcc main.c f1.c -o test
$ ./test
false
executed
何故ですか?このコードには何らかの未定義の動作がありますか?
注:でコンパイルしましたgcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
。
main()
単純化することができint main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
-これは、より良い不一致を示すだろう。
void
?
true
し、false
K&R第1版インチなので、全てのこのような問題はありませんでした。trueとfalseは0であり、0以外でした。だよね?当時プロトタイプが入手可能だったかどうかはわかりません。
_Bool
タイプも<stdbool.h>
ヘッダーもありませんでした。
f1()
、と同じファイルにコピーしたとしてもmain()
、奇妙なことになります。C++では()
空のパラメーターリストに使用するのが適切ですが、Cではまだ定義されていないパラメーターリストを持つ関数に使用されます(基本的には)
)の後にK&Rスタイルのパラメーターリストが必要です。正しいCにするには、コードをに変更する必要がありますbool f1(void)
。