2014-06-30 43 views
0

我正在写一个非常简单的三元运算符与我的枚举之一,我偶然发现什么是一个非常奇怪的错误(对我来说)。鉴于这段代码:与三元运算符奇怪的枚举行为

typedef enum 
{ 
    first = 0, 
    second, 
    last 
}myEnum; 

myEnum myVar = first; 

(myVar < second) ? myVar++ : myVar = last; 

编译器发出以下错误:

error: lvalue required as left operand of assignment

在哪里,如果我只是三元更改为的if/else块这样的:

if(myVar < second) 
{ 
    myVar++; 
} 
else 
{ 
    myVar = last; 
} 

一切都编译和工作正常。有人可以解释为什么完全相同的代码编写为三元不会编译?我错过了什么?

+0

@dyp“三元运算符的第三部分不能是赋值表达式”为什么不?如果你适当地使用括号,它应该工作(但可能会使读者感到困惑)。 – glglgl

回答

5

表达式解析为:

((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

+0

你是对的我的表情没有按照我的意图解析。有点棘手的艾莫,必须是人们说避免三元的原因之一..什么是HTH btw? – Asics

+1

@Asics:“希望这有助于”。另一件事:请注意,三元运算符的第二个操作数是_expression_,而不是_conditional-expression_,所以'myVar> = second? myVar = last:myVar ++'... – mafso

1

你做什么和你想做什么是不可比的。

这一个

if(myVar < second) 
{ 
    myVar++; 
} 
else 
{ 
    myVar = last; 
} 

转化为

myVar = (myvar < second) ? myvar + 1 : last; 

如果你想完全建立在的副作用,可以如做

(myVar < second) ? myVar++ : (myVar = last); 

,但我不知道这是一种很好的风格,因为它可能会使读者对表达的意图感到困惑。