nextの値がNULL(ノードはリンクリスト)の場合、次のステートメントが保護違反やその他の恐ろしいものにつながる可能性があるかどうか疑問に思っていました。
if (!node->next || node->next->some_field != some_value) {
最初の部分が真になると、ORの2番目の部分は評価されないと仮定します。私はこれを仮定するのは間違っていますか?このコンパイラは固有ですか?
nextの値がNULL(ノードはリンクリスト)の場合、次のステートメントが保護違反やその他の恐ろしいものにつながる可能性があるかどうか疑問に思っていました。
if (!node->next || node->next->some_field != some_value) {
最初の部分が真になると、ORの2番目の部分は評価されないと仮定します。私はこれを仮定するのは間違っていますか?このコンパイラは固有ですか?
ISO-IEC-9899-1999標準(C99)、セクション6.5.14:
|| オペランドのいずれかが0と等しくない場合、演算子は1を返します。それ以外の場合は、0になります。結果の型はintです。4ビット単位とは異なり| 演算子、|| オペレーターは左から右への評価を保証します。最初のオペランドの評価後にシーケンスポイントがあります。最初のオペランドが0と等しくない場合、2番目のオペランドは評価されません。
これはコンパイラ固有ではありません。の場合、残りの条件はnode->next
評価されません。NULL
ORでは、
if ( expr_1 || expr_2)
expr_2は、expr_1が失敗した場合(falseの場合)にのみ「テスト済み」になります
ANDで
if( expr_1 && expr_2 )
expr_2は、expr_1が成功した場合にのみ「テスト済み」になります(true)
左側がtrueと評価された場合、右側のブール式は評価されないと想定しても問題ありません。関連する質問を参照してください。
コンパイラ固有ではありません。あなたは安全に短絡に頼ることができ、あなたのコードは期待通りに機能します。
あなたは正しいです。
演算子の後の条件( )を評価する前に、演算子( )の前compiler independent
の条件が評価されます。条件がの場合、条件を評価せずに全体が評価されます。first
OR
!node->next
second
node->next->some_field != some_value
OR
first
true
expression
true
second
あなたはあなたのためにこの機能を最大限に活用しているだけですlinked list
。next
ポインタの場合にのみ、さらにポインタにアクセスしますnot NULL
。