x
ブール式を左側でポストインクリメントするときに、ブール式の両側で使用できますか?
問題の行は次のとおりです。
if(x-- > 0 && array[x]) { /* … use x … */ }
それは標準で定義されていますか?array [x]はの新しい値x
または古い値を使用しますか?
x
ブール式を左側でポストインクリメントするときに、ブール式の両側で使用できますか?
問題の行は次のとおりです。
if(x-- > 0 && array[x]) { /* … use x … */ }
それは標準で定義されていますか?array [x]はの新しい値x
または古い値を使用しますか?
場合によります。
&&
が通常の短絡論理演算子である場合は、シーケンスポイントがあるため、問題ありません。array[x]
新しい値を使用します。
がユーザー(またはライブラリ)で定義されたオーバーロード演算子である場合&&
、短絡はなく、の評価x--
との評価の間のシーケンスポイントの保証もありませんarray[x]
。これはあなたのコードを考えるとありそうもないように見えますが、文脈がなければ確実に言うことはできません。array
を慎重に定義すれば、そのように配置することは可能だと思います。
これが、ほとんどの場合、オーバーロードするのは悪い考えである理由operator&&
です。
ちなみに、if ((x > 0) && array[--x])
非常によく似た効果があり(ここでも、演算子がシェナニガンにオーバーロードしていないと仮定します)、私の意見ではより明確です。x
違いは、0を超えてデクリメントされるかどうかです。これは、信頼できる場合とできない場合があります。
はい、明確に定義されています。&&
シーケンスポイントを導入します。