6

nextの値がNULL(ノードはリンクリスト)の場合、次のステートメントが保護違反やその他の恐ろしいものにつながる可能性があるかどうか疑問に思っていました。

if (!node->next || node->next->some_field != some_value) {

最初の部分が真になると、ORの2番目の部分は評価されないと仮定します。私はこれを仮定するのは間違っていますか?このコンパイラは固有ですか?

4

5 に答える 5

10

ISO-IEC-9899-1999標準(C99)、セクション6.5.14:

|| オペランドのいずれかが0と等しくない場合、演算子は1を返します。それ以外の場合は、0になります。結果の型はintです。4ビット単位とは異なり| 演算子、|| オペレーターは左から右への評価を保証します。最初のオペランドの評価後にシーケンスポイントがあります。最初のオペランドが0と等しくない場合、2番目のオペランドは評価されません。

これはコンパイラ固有ではありません。の場合、残りの条件はnode->next評価されません。NULL

于 2013-01-10T13:18:19.017 に答える
5

ORでは、

if ( expr_1 || expr_2)

expr_2は、expr_1が失敗した場合(falseの場合)にのみ「テスト済み」になります

ANDで

if( expr_1 && expr_2 )

expr_2は、expr_1が成功した場合にのみ「テスト済み」になります(true)

于 2013-01-10T13:15:56.197 に答える
2

左側がtrueと評価された場合、右側のブール式は評価されないと想定しても問題ありません。関連する質問を参照してください。

于 2013-01-10T13:16:14.333 に答える
2

コンパイラ固有ではありません。あなたは安全に短絡に頼ることができ、あなたのコードは期待通りに機能します。

于 2013-01-10T13:16:47.100 に答える
2

あなたは正しいです。

演算子の後の条件( )を評価する前に、演算子( )の前compiler independentの条件が評価されます。条件がの場合、条件を評価せずに全体が評価されます。firstOR!node->nextsecondnode->next->some_field != some_valueORfirsttrueexpressiontruesecond

あなたはあなたのためにこの機能を最大限に活用しているだけですlinked listnextポインタの場合にのみ、さらにポインタにアクセスしますnot NULL

于 2013-01-10T13:17:30.297 に答える