As @Rakete said in their excellent answer, this is tricky. I’d like to add on to that a little.
The ternary operator must have the form:
logical-or-expression
?expression:assignment-expression
So we have the following mappings:
someValue: logical-or-expression++x, ++y: expression- ??? is assignment-expression
--x, --yor only--x?
In fact it is only --x because an assignment expression cannot be parsed as two expressions separated by a comma (according to C++’s grammar rules), so --x, --y cannot be treated as an assignment expression.
Which results in the ternary (conditional) expression portion to look like this:
someValue?++x,++y:--x
It may help for readability’s sake to consider ++x,++y to be computed as-if parenthesized (++x,++y); anything contained between ? and : will be sequenced after the conditional. (I’ll parenthesize them for the rest of the post).
and evaluated in this order:
someValue?(++x,++y)or--x(depending onboolresult of 1.)
This expression is then treated as the left sub-expression to a comma operator, with the right sub-expression being --y, like so:
(someValue?(++x,++y):--x), --y;
Which means the left side is a discarded-value expression, meaning that it is definitely evaluated, but then we evaluate the right side and return that.
So what happens when someValue is true?
(someValue?(++x,++y):--x)executes and incrementsxandyto be11and11- The left expression is discarded (though the side effects of increment remain)
- We evaluate the right hand side of the comma operator:
--y, which then decrementsyback to10
To “fix” the behavior, you can group --x, --y with parentheses to transform it into a primary expression which is a valid entry for an assignment-expression*:
someValue?++x,++y:(--x, --y);
*It’s a rather funny long chain that connects an assignment-expression back to a primary expression:
assignment-expression —(can consist of)–> conditional-expression –> logical-or-expression –> logical-and-expression –> inclusive-or-expression –> exclusive-or-expression –> and-expression –> equality-expression –> relational-expression –> shift-expression –> additive-expression –> multiplicative-expression –> pm-expression –> cast-expression –> unary-expression –> postfix-expression –> primary-expression