11

xブール式を左側でポストインクリメントするときに、ブール式の両側で使用できますか?

問題の行は次のとおりです。

 if(x-- > 0 && array[x]) { /* … use x … */ }

それは標準で定義されていますか?array [x]はの新しい値xまたは古い値を使用しますか?

4

2 に答える 2

13

場合によります。

&&が通常の短絡論理演算子である場合は、シーケンスポイントがあるため、問題ありません。array[x]新しい値を使用します。

がユーザー(またはライブラリ)で定義されたオーバーロード演算子である場合&&、短絡はなく、の評価x--との評価の間のシーケンスポイントの保証もありませんarray[x]。これはあなたのコードを考えるとありそうもないように見えますが、文脈がなければ確実に言うことはできません。arrayを慎重に定義すれば、そのように配置することは可能だと思います。

これが、ほとんどの場合、オーバーロードするのは悪い考えである理由operator&&です。

ちなみに、if ((x > 0) && array[--x])非常によく似た効果があり(ここでも、演算子がシェナニガンにオーバーロードしていないと仮定します)、私の意見ではより明確です。x違いは、0を超えてデクリメントされるかどうかです。これは、信頼できる場合とできない場合があります。

于 2010-10-28T15:43:41.763 に答える
11

はい、明確に定義されています。&&シーケンスポイントを導入します。

于 2010-10-28T15:35:11.760 に答える