2016-08-07 8 views
1

、予想外に私はワンセグのせいではありませんでした。しかし、私がp*pの順番をif()(コメントのようなもの)に変更した場合、私はseg faultになります。ヌルポインタの逆参照でセグメンテーションがないのはなぜですか?</p> <pre><code>int main() { int *p = NULL; if (p && *p); //if (*p && p); return 0; } </code></pre> <p>私はこのコードを実行し、私はこの単純なCコードを書かれている

誰かが理由を説明できますか?

+0

最初のものは標準的なものです。ちょっとした研究をしたら、あなたは自分自身を見つけたでしょう。または、あなたが '&&'演算子の説明を読んでいればいいでしょう。しかし、明らかに最初に尋ねることは学習よりも簡単です。 Re。第2の変種( '* p %% p'):なぜあなたはセグメンテーションを期待していますか?定義されていない動作を呼び出します。 ** undefined **という意味を考えてみてください。 – Olaf

答えて

4

& &演算子には短絡の評価があります。左のオペランドの値を調べるだけで結果を判断できる場合、右のオペランドは評価されません。 & &演算子の場合、これは、左側がfalseと評価された場合、右側を評価せず、結果がfalseであることを意味します。換言すれば、

if (p && *p) ... 

はC11標準から

if (p) if (*p) ... 

に相当し、セクション6.5.13/4:

ビット単位のバイナリ&オペレータ、& &オペレータは異なり左から右の評価を保証する。 第2オペランドが評価される場合、第1オペランドと第2オペランドの評価の間には、 のシーケンスポイントがあります。最初のオペランドが0と等しい場合、2番目の オペランドは評価されません。

+0

あなたの答えへの参照はありますか? –

+0

@ParthaBera:追加されました。 –

+0

これはcにも当てはまりますか? –

関連する問題

 関連する問題