10

ここで何が起こっているのですか?

#include <iostream>
using namespace std;

int main(){

    int x=0,y=0;
    true? ++x, ++y : --x, --y; 
    cout << "x: " << x << endl;
    cout << "y: " << y << endl; //why does y=0 here?

    x=0,y=0;
    false ? ++x, ++y : --x, --y; 
    cout << "x: " << x << endl;
    cout << "y: " << y << endl;
}

x: 1
y: 0

x: -1
y: -1

2番目のケースは問題ないようです。最初のケースでは、xとyの両方が1にインクリメントされると予想しますが、左側のオペランドのみがインクリメントします。

4

3 に答える 3

20

最初のものは次のものと同等です:

(true  ? (++x, ++y) : (--x)), --y; 

2番目のものは次のものと同等です。

(false ? (++x, ++y) : (--x)), --y; 

したがって、--yは常に実行されます。最初の行では、増分が最初に実行されるためx = 1, y = 0、予想されます。2行目では、のデクリメントがx最初に実行されるためx = -1, y = -1、予想されます。


Barmarによる(別の回答への)コメントに記載されているように:

そして、なぜとの間のコンマが同じ効果++xをもたらさないのか疑問に思っている人のために、それはまったく有効ではないからです。したがって、コンパイラは、が見つかるまでスキャンを続けますが、それを超えると、優先順位の低い演算子[(この例では)またはステートメントの終わり]に到達すると停止します。++y(true? ++x):,

于 2012-08-27T04:19:41.423 に答える
4

すべてのC++演算子の中でコンマの優先順位が最も低いため、これyはゼロです。その優先順位は三項条件演算子の優先順位よりも低いため、条件演算子はおよびとして解析されます。どちらの場合も、ステートメントは無条件に実行されます。true? ++x, ++y : --xfalse? ++x, ++y : --x--y

編集コンパイラがを検出したため、最初のコンマは異なります。したがって、条件の「trueの場合」の式を完了する?必要があります。:そのため、++xとの両方++yが取り入れられています。

于 2012-08-27T04:21:55.923 に答える
0

標準を読む

§5.18コンマ演算子[expr.comma]

¶1コンマ演算子は左から右にグループ化します。

expression:
assignment-expression
expression , assignment-expression

カンマで区切られた式のペアは、左から右に評価されます。左の式は破棄された値の式です(5節)。83左の式に関連するすべての値の計算と副作用は、右の式に関連するすべての値の計算と副作用の前に順序付けられます。結果のタイプと値は、右のオペランドのタイプと値です。結果は、右のオペランドと同じ値のカテゴリになり、右のオペランドがglvalueとビットフィールドの場合はビットフィールドになります。

¶2コンマに特別な意味が与えられている状況では、[例:関数の引数のリスト(5.2.2)および初期化子のリスト(8.5)-例を終了]第5節で説明されているコンマ演算子は括弧内にのみ表示できます。 。[ 例:

f(a, (t=3, t+2), c);

3つの引数があり、そのうちの2番目の値は5です。—end example]

于 2012-08-27T04:21:48.967 に答える