c - C 中的三元运算符和左值

标签 c

假设我有一个链表 L,它可能为 NULL,也可能不是。当我尝试

   !L ? s+=2 : t+=2;

编译器提示需要左值作为赋值的左操作数。我错过了什么?也许是运算符优先级?

最佳答案

相关语法产生式为:

conditional-expression:

logical-OR-expression

logical-OR-expression ? expression : conditional-expression

t+=2 不是条件表达式,所以编译器必须解释 !L ? s+=2 : t+=2 等同于 (!L ? s+=2 : t)+=2。在 C 中,条件表达式永远不会产生左值,因此不能出现在 += 的左侧。

(t+=2) 是一个条件表达式,所以 !L ? s+=2 : (t+=2) 是正确的。


作为引用,在C++中相关的语法产生式是:

conditional-expression:

logical-or-expression

logical-or-expression ? expression : assignment-expression

t+=2 是一个赋值表达式,所以 !L ? s+=2 : t+=2 是有效的 C++,并且按照您的想法行事。

有趣的是,在 C++ 中,如果条件运算符的第二个和第三个操作数的未衰减公共(public)类型是左值,则条件运算符可以产生左值。但如果我对标准的解读是正确的,那么这个事实与本案无关。

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

相关文章:

c - int *ptr = (int*)(&a + 1);

c - C 中的指针数组

c - 用于网络编程的 gdb 宏

c - 从文件中读取 N 个字节并使用 read() 和 write() 打印它

c编程获取sleep后tty的修改时间

c++ - 通过下标 : legal by the C++ Standard or not? 获取一个过去的数组元素的地址

C - 转换为 2s 补码

c - #include 实际上做了什么?

C - 将 int 转换为 char

c - 最大堆 ​​- C 中的样本