4

これは安全ですか:

if(sprite->numberOfSides !=0 && sprite->value%sprite->numberOfSides!=0)

sprite-> numberOfSides can == 0?

私が尋ねる理由は、ifステートメントを次のようにフレーム化するかどうかです。

if(sprite->value%sprite->numberOfSides!=0 && sprite->numberOfSides !=0)

例外が発生します(n%0ができないため)。前のステートメントに戻すことは問題なく機能しますが、別のデバイス用にコンパイルするときに問題が発生することはありません。

4

3 に答える 3

8

はい、安全です。規格により短絡が保証されています。

これは、and(&&)式の最初の部分がと評価されたfalse場合、2番目の部分が評価されないことが保証されることを意味します。

C++03から-5.14/1

演算子は&&左から右にグループ化します。[...]最初のオペランドが。の場合、2番目のオペランドは評価されませんfalse

于 2012-06-05T18:53:01.483 に答える
4

&&組み込みの演算子について話している限り、安全です。他の回答が既に述べたように、組み込み演算子の評価は短絡的です。左側のオペランドが常に最初に評価され、それが と評価されたfalse場合、右側のオペランドは触れられません。

ただし、オーバーロードされた operator を扱う場合は&&、他のオーバーロードされた二項演算子と同じように動作します。つまり、両方のオペランドが評価されます。

于 2012-06-05T18:57:01.403 に答える
2

はい、組み込み型(ブール値など)の場合。この動作は短絡として知られています。これは、&&が実際には式の最初のステートメントに関連付けられた関数であるために発生しますが、演算子としてのステータスもあるため、特別な構文です。この関数内では、通常、式がfalseであるかどうかだけでなく、nullのチェックも行われます。&&演算子の場合、ブール値がfalseの場合、これは論理式の評価を停止するのに十分な理由であり、評価時間を節約できます。

于 2012-06-05T18:54:00.523 に答える