三元运算符和赋值运算符

Zxc*_*Mnb 5 c c++ conditional-operator associativity assignment-operator

C/C++ 三元运算符实际上与赋值运算符具有相同的优先级吗

Luchian Grigore 的回答说,类似的情况

a ? b : c = d
Run Code Online (Sandbox Code Playgroud)

总是会被推断为

a ? b : ( c = d )
Run Code Online (Sandbox Code Playgroud)

因为 = 和 ?: 从右到左关联,所以

在 C++ 中

k =  21 > 3 ? j = 12 : j = 10;
Run Code Online (Sandbox Code Playgroud)

k = 1 > 3 ? j = 12 : j = 10;
Run Code Online (Sandbox Code Playgroud)

两者都很好。

在C中

k = 21 > 3 ? 12 : j = 10
Run Code Online (Sandbox Code Playgroud)

返回错误

invalid lvalue in assignment.
Run Code Online (Sandbox Code Playgroud)

上面不应该被推断为(并且不返回错误)

k=  21 > 3 ? 12 : ( j = 10 )
Run Code Online (Sandbox Code Playgroud)

我认为现在它被分组为

k = ( 21 > 3 ? 12 : j ) = 10
Run Code Online (Sandbox Code Playgroud)

这会产生错误,因为在 C(不是 C++)中,三元运算符无法返回左值。谁能准确地告诉我在这种情况下运算符是如何分组的。

Mar*_*k B 2

您链接的问题(C/C++ 三元运算符实际上与赋值运算符具有相同的优先级吗?)@hvd 的回答显示了答案。

C++ 和 C 语法?:不同。

在 C++ 中,最右边的操作数允许是赋值表达式(因此编译器[贪婪地] 将 are 视为=的一部分?:),而在 C 中,最右边的操作数是 a conditional-expression。因此,在 C 中,一旦编译器命中=的分析?:就完成了,并将其视为k = ( 21 > 3 ? 12 : j ) = 10.