On Sunday, 8 April 2018 at 07:22:19 UTC, Patrick Schluter wrote:
You may find an in-depth discussion of the C++ case in

https://stackoverflow.com/questions/7499400/ternary-conditional-and-assignment-operator-precedence

My formulation was ambiguous, it is the same precedence as the link says. The link also says that's it's right to left evaluation. This means that for expression:

    a ? b = c : d = e;


right to left evaluation will make the = e assignment higher priority than the b = c assignment or the ternary even if they have the same priority level.

To summarize: C++ works as expected and C prevents the assigment because the conditional operator does not yield an l-value:

ccondo1.c
---
int main ()
{
   int a, b;
   1 ? a = 1 : b = 2;
   return 0;
}
---

$ cc ccondo1.c
ccondo1.c: In function 'main':
ccondo1.c:4: error: lvalue required as left operand of assignment

Other languages:
----------------

- go: has no ternary conditional

- Java: Same as in C, example does not compile due to missing l-value.

- JS: Like C++ (!).

https://www.ecma-international.org/ecma-262/6.0/#sec-conditional-operator

"The grammar for a ConditionalExpression in ECMAScript is slightly different from that in C and Java, which each allow the second subexpression to be an Expression but restrict the third expression to be a ConditionalExpression. The motivation for this difference in ECMAScript is to allow an assignment expression to be governed by either arm of a conditional and to eliminate the confusing and fairly useless case of a comma expression as the centre expression."

Reply via email to