我正在用我的枚举之一编写一个非常简单的三元操作符,我偶然发现了一个非常奇怪的错误(对我来说…)。给定这段代码:
typedef enum
{
first = 0,
second,
last
}myEnum;
myEnum myVar = first;
(myVar < second) ? myVar++ : myVar = last;
编译器给了我以下错误:
错误:左值是赋值的左操作数
如果我只是把三进制改成if/else块,就像这样:
if(myVar < second)
{
myVar++;
}
else
{
myVar = last;
}
一切都可以编译并正常工作。有人能解释一下为什么完全相同的代码写成三进制不会编译吗?我错过了什么?
您的表达式解析为:
( (myVar < second) ? myVar++ : myVar ) = last;
但你似乎有意这样做:
(myVar < second) ? myVar++ : (myVar = last);
这实际上并不是标准要求的(但许多编译器都这样解析它),第一个表达式实际上应该由于其他原因而失败(语法错误而不是违反约束)。
C99 6.5.15说:
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
和myVar = last
不是条件表达式,而是赋值表达式 (C99 6.5.16):
assignment-expression:
conditional-expression
unary-expression assignment-operator assignment-expression
,但(myVar < second) ? myVar++ : myVar
不是一元表达式(参见C99 6.5.3)(但其括号版本将是,这是我在第一个代码片段中写的,参见C99 6.5.1)。
HTH
你所做的和你试图做的是不可比较的。
这个if(myVar < second)
{
myVar++;
}
else
{
myVar = last;
}
翻译
myVar = (myvar < second) ? myvar + 1 : last;
如果你想完全建立在副作用上,你也可以使用
(myVar < second) ? myVar++ : (myVar = last);
但我不确定这是一个好的风格,因为它可能会混淆读者对表达的意图