0

重複の可能性:
短絡ブール演算子は C/C++ で義務付けられていますか? そして評価順?

次のコードを検討してください。

char* str=NULL;
if(str!=NULL && str[0]=='h')
    printf("ok");

確認された最初の条件は、str が NULL ではないことです。このコードをコンパイルして実行しようとしましたが、セグメンテーション違反は発生しません。
これは、コードが if の次の命令で中断することを意味します。これは、str[0] が and であるため、str[0] が 'h' に等しいことをさらに検証する必要がないためです。
しかし問題は、これがすべてのコンパイラで動作することが保証されているかどうかです。何らかの理由で、最初に str が 'h' と等しいことを確認し (セグメンテーション違反を引き起こします)、次に str が NULL でないことを確認するアセンブリ コードをコンパイラが生成することはあり得ませんか?

4

2 に答える 2

3

はい、これは保証されています。短絡評価といいます。

C99 標準から (セクション 6.5.13):

&ビットごとの二項演算子とは異なり、&&演算子は左から右への評価を保証します。最初のオペランドの評価の後にシーケンス ポイントがあります。最初のオペランドが 0 と等しい場合、2 番目のオペランドは評価されません。

同様の規則が に適用され||ます。最初のオペランドが true の場合、2 番目のオペランドは評価されません。

于 2012-05-01T15:39:47.747 に答える
0

はい。それが機能するはずの方法です。

于 2012-05-01T15:39:44.447 に答える