【发布时间】:2013-05-31 07:08:16
【问题描述】:
GCC 有一个 awesome ternary expression extension to C,它允许我们创建这样的语句:
int x = some_var ?: 10; // expands to some_var ? some_var : 10
这真的很好,虽然它不是特别直观,但它确实有效。 C 语言中的大多数二元运算符都有一个与之关联的附加运算符,它允许赋值:
x = x + 2;
// instead, we can say
x += 2;
既然是这种情况,大多数二进制 C 运算符的规范(+、-、*、/、%、|、&、^) ,为什么三元扩展运算符不是这样:
int x = ...;
x ?:= 2; // error: Expected expression before '=' token
// which would expand to
x = x ?: 2;
在标准 C 中不支持这一点的唯一运算符是逻辑运算符(||、&&),绝对三元不属于这些运算符,为什么不能?我们不这样做吗?
我真的很想在我的代码中制作一个带有酷发型的笑脸,但我做不到!这是设计操作员时的疏忽,还是故意并记录在某处?这是运算符短路其操作数的结果,还是完全其他原因?
【问题讨论】:
-
不确定
x ?:= 2;是什么意思,但可能是x ?= ValueWhenXTrue:ValueWhenXFalse;。 -
我看不出这个问题“没有建设性”。它完全符合主题,讨论了 GNU C 中特定运算符的行为。它被正确标记,给出了简单、具体的例子,并且有一个明确的答案。
-
@chux 用人类的话说就是
if x is zero, set it to 2。 -
x ?:= 2的语义是什么?在表达式中:a = x ? b : c,有四个操作数,在扩展a = x ?: b中有三个,在你的提案a ?:= b中只有两个 - 分配的值和要分配的值,但没有条件 - 你使它变得毫无意义——没有合理的语义解释。 -
@Clifford 条件将是您分配给的左值。
标签: c gcc ternary-operator gcc-extensions