13

以下の 2 つのサブプログラムの結果が異なる理由がわかりません。

    int a , b;

    a = 13, b=12;
    (a > b)? (a++,b--):(a--,b++); // Now a is 14 and b is 11

    a = 13, b=12;
    (a > b)? a++,b-- : a--,b++;   // Now a is 14 but b is 12

ただし、これらの場合、結果は同じです。

    a = 13, b=12;
    (a < b) ? a++,b-- : a--,b++; // Now a is 12 and b is 13

    a = 13, b=12;
    (a < b) ? (a++,b--) : (a--,b++); // Again a is 12 and b is 13

after のステートメントでは括弧が違いを"?"生むのに、 after のステートメントでは違いがないのはなぜ":"ですか? 何か考えはありますか?

4

4 に答える 4

24

これです:

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

次と同等です。

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

sobは常に増加し、時々減少するだけです。?との間のコンマ演算子を解析する方法は:、'equivalent to' 式で括弧で囲まれている場合を除きます。ただし、 の後:、括弧で囲まれていないコンマは三項?:演算子を終了し、インクリメントを無条件に実行したままにします。コンマ演算子の優先順位は非常に低いです。

于 2013-05-31T09:28:12.133 に答える
4

C++ 文法の関連部分は次のとおりです。

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression
assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator assignment-expression
    throw-expression
expression:
    assignment-expression
    expression, assignment-expression

要約すると、条件式の「中間」は まで拡張された完全な式にすることができますが:、最後のサブ式は、コンマ演算子を使用する式を除外する代入式のみにすることができます (コンマ演算子が次のように表示される場合を除く)。括弧で囲まれた一次式などの代入式の有効な部分式の一部、または別の条件式の 2 番目のオペランドとして)。

Cでは、最後のサブ式はより制限されています。これはあなたの例では問題ではありませんが、割り当て式にすることさえできません。

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression
于 2013-05-31T09:39:01.333 に答える
3

この場合

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

と同等です

((a > b)? a++,b-- : a--),b++; 
于 2013-05-31T09:28:46.050 に答える
2

x ? y有効な式と見なすことができないため、コンマで演算子を分割できないためだと思います。x ? y : zは有効な式です。コロンの後のコンマは 2 つの式に分割できます。

于 2013-05-31T09:29:01.717 に答える