そのコードをコンパイルするので、returnステートメントは条件付きになります。意味:
if(cur = scan_comm())
return last;
グラハム・ボーランド、これは正しいのですが、問題が何であるかが明確になっていることを確認したいと思います。これを見てください:
int somef(int a)
{
if(a == 0)
#if something
a++;
#endif
return 0;
}
int main() {
int a = 3;
int b = 10;
b = somef(a);
printf("b is %d\n", b);
...do more useful stuff with b...
このコードをコンパイルするとgcc -Werror -Wall
、「制御が非void関数の終わりに到達する」などのように失敗するはずです。これにより、コードに問題があることが通知されます。
安全オプションなしでコンパイルすると、警告なしでコンパイルされる可能性があります。これですべてが正常だと思いますが、このサンプルコードsomething
ではコードが定義されていないため、そのコードはなくなり、関数呼び出しから「0」が返されません。この特定のケースでは、bに3が割り当てられました。
ここでは、いくつかの未定義の動作に入りました。さて、bを使って「便利なこと」をしていると、元々は0だったと思っていたので、値が「3」だった理由を理解するのに非常に苦労します。
角かっこを使用するのは常に安全です。
if (cur = scan_comm())
add_token(cur);
return last;
対。
if (cur = scan_comm())
{
add_token(cur);
}
return last;
これらはどちらも同じように機能しますが、2番目は愚かな間違いから保護するのに役立ちます。