9

このステートメントの理由:

int a = 7, b = 8, c = 0;
c = b>a?a>b?a++:b++:a++?b++:a--;
cout << c;

と等しくない:

int a = 7, b = 8, c = 0;
c = (b>a?(a>b?a++:b++):a++)?b++:a--;
cout << c;

と等しい :

int a = 7, b = 8, c = 0;
c = b>a?(a>b?a++:b++):(a++?b++:a--);
cout << c;

理由を教えてください。なんで ?

4

3 に答える 3

15

? :右から左への結合であるためです。言語ではそのように定義されています。

于 2010-05-09T11:58:29.457 に答える
7

@sthが正しい答えを提供したと思いますが、@Skilldrickはコメントで正しいと思います-なぜあなたはそのようなことを書くのでしょうか。

優先順位の問題と同様に、単一のステートメントで同じ変数をインクリメントするときは本当に注意が必要です。ステートメントにはシーケンス ポイントがある場合とない場合があるため、インクリメントの評価順序が保証されない場合があります。コンパイラが異なると結果が異なる場合や、同じコンパイラでも最適化設定が異なる場合があります。

于 2010-05-09T11:52:58.660 に答える
1

演算子&&||、およびは、?:式内でフロー制御を実行します。?:if-else ステートメントのように動作します。

c = b>a?a>b?a++:b++:a++?b++:a--;

if ( b>a )
    if ( a>b )
        a ++;
    else
        b ++;
else if ( a ++ )
    b ++;
else
    a --;

b>a? (
    a>b ?
        a ++
    :
        b ++
) : ( a ++ ?
    b ++
:
    a --
)

のような動作をさせるには結合性が必要if … else if … elseです。

ときどき、辞書式順序比較のために、あなたの表現に似た表現を使用します。

operator< ()( arr &l, arr &r ) {
    return l[0] < r[0]? true
         : r[0] < l[0]? false
         : l[1] < r[1]? true
         : r[1] < l[1]? false
         : l[2] < r[2];
}
于 2010-05-10T00:39:00.357 に答える