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++)中,三元运算符无法返回左值。谁能准确地告诉我在这种情况下运算符是如何分组的。
您链接的问题(C/C++ 三元运算符实际上与赋值运算符具有相同的优先级吗?)@hvd 的回答显示了答案。
C++ 和 C 语法?:不同。
在 C++ 中,最右边的操作数允许是赋值表达式(因此编译器[贪婪地] 将 are 视为=的一部分?:),而在 C 中,最右边的操作数是 a conditional-expression。因此,在 C 中,一旦编译器命中=的分析?:就完成了,并将其视为k = ( 21 > 3 ? 12 : j ) = 10.