c - 三元运算符中的赋值

标签 c conditional-operator

对于三元运算符,为什么会编译以下内容:

a > b ? a=4 : ' ';
但这个没有:
a > b ? ' ' : b=4;

lvalue required as left operand of assignment


也就是说,是什么让 truefalse 不同的情况分配的情况?

最佳答案

它与条件运算符的正式定义有关。来自 C standard 的第 6.5.15 节:

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

条件的第二个子句可以是任何表达式,而第三个子句只能是条件表达式(其中赋值不是)。换句话说,条件运算符 ?:具有比赋值运算符更高的优先级 = .
所以这:
a > b ? a=4 : ' '
是不是和这个一样:
(a > b) ? (a=4) : (' ')
但是这个:
a > b ? ' ' : b=4;
与此相同:
((a > b) ? (' ') : b)=4;
并且不能将条件运算符的结果分配给(即它不是左值),因此您会收到错误消息。
如果添加括号,您可以获得编译的内容:
a > b ? ' ' : (b=4);
当然,这些语句看起来不是条件语句的最佳用例,应该重写为:
if (a>b) a=4;
和:
if (a<=b) b=4;

关于c - 三元运算符中的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65891926/

相关文章:

c - 将文本文件中的数字读入动态分配的二维数组

c# - 这个简单的条件运算符会在编译时优化吗? (。网)

objective-c - Objective-C-循环播放但循环条件为假

c - autotools:执行 “make check” 时不包含库

检查 malloc 是否正在使用 pmap 分配所有内存

powershell - 为什么 Powershell 中的三元运算符不分配我的值?

reactjs - React 组件中嵌套三元表达式的替代方案,有条件地传递 prop 值

java - 什么是 Java ? : operator called and what does it do?

c++ - 如何使用 SSE 更有效地乘以 A*B^T 或 A^T*B^T(T 表示转置)矩阵?

c - 定义函数指针的正确方法