Comma operator precedence while used with ? : oper

2019-04-19 05:28发布

问题:

This question already has an answer here:

  • Something we found when using comma in condition ternary operator? [duplicate] 4 answers
  • What's the precedence of comma operator inside conditional operator in C++? 3 answers

I have no idea why the result of the two sub programs below are different:

    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

However for these cases, the results are identical:

    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

Why parentheses make difference for the statement after "?", but make no difference for the statement after ":"? Do you have any idea?

回答1:

This one:

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

is equivalent to:

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

so b is always incremented and only sometimes decremented. There is no way to parse the comma operator between ? and : other than as parenthesized in the 'equivalent to' expression. But after the :, the unparenthesized comma terminates the ternary ?: operator and leaves the increment as unconditionally executed. The precedence of the comma operator is very, very low.



回答2:

The relevant parts of the C++ grammar are:

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

In summary, while the 'middle' of a conditional expression can be a full expression extending up to the :, the last sub-expression can only be an assignment-expression which excludes expressions using the comma operator (other than where the comma operator appears as part of valid sub-expression of an assignment-expression such as a parenthesized primary-expression or as the second operand of another conditional-expression).

In C, the last sub-expression is more restricted, it cannot even be an assignment-expression although this is not a concern in your example.

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression


回答3:

In this case

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

It is equivalent to

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


回答4:

I guess it's because x ? y cannot be considered a valid expression, therefore the comma can't split the operator there. x ? y : z is a valid expression, the the comma after the colon can split into two expressions.