我正在写一个非常简单的三元运算符和我的一个枚举,我偶然发现了一个非常奇怪的错误(对我来说......).鉴于这段代码:
typedef enum
{
first = 0,
second,
last
}myEnum;
myEnum myVar = first;
(myVar < second) ? myVar++ : myVar = last;
Run Code Online (Sandbox Code Playgroud)
编译器发给我以下错误:
错误:左值作为赋值的左操作数需要左值
好像我只是将三元组更改为if/else块,如下所示:
if(myVar < second)
{
myVar++;
}
else
{
myVar = last;
}
Run Code Online (Sandbox Code Playgroud)
一切都编译好,工作正常.有人可以解释为什么写成三元组的完全相同的代码无法编译?我错过了什么?
您的表达式被解析为:
( (myVar < second) ? myVar++ : myVar ) = last;
Run Code Online (Sandbox Code Playgroud)
但你似乎打算这样做:
(myVar < second) ? myVar++ : (myVar = last);
Run Code Online (Sandbox Code Playgroud)
这实际上并不完全符合标准的要求(但许多编译器以这种方式解析),第一个表达式实际上应该由于另一个原因而失败(语法错误而不是约束违规).
C99 6.5.15说:
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
Run Code Online (Sandbox Code Playgroud)
并且myVar = last不是条件表达式而是赋值表达式(C99 6.5.16):
assignment-expression:
conditional-expression
unary-expression assignment-operator assignment-expression
Run Code Online (Sandbox Code Playgroud)
但(myVar < second) ? myVar++ : myVar不是一元表达式(参见C99 6.5.3)(但其括号内的版本将是,就像我在我的第一个代码片段中所写,见C99 6.5.1).
HTH
| 归档时间: |
|
| 查看次数: |
678 次 |
| 最近记录: |