【问题标题】:Strange enum behavior with ternary operators三元运算符的奇怪枚举行为
【发布时间】:2014-06-30 13:57:58
【问题描述】:

我正在用我的一个枚举编写一个非常简单的三元运算符,我偶然发现了一个非常奇怪的错误(对我来说......)。鉴于这段代码:

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

myEnum myVar = first;

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

编译器向我发送了以下错误:

错误:需要左值作为赋值的左操作数

好像我只是将三元组更改为这样的 if/else 块:

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

一切都可以编译并且工作正常。有人可以解释为什么写成三元组的完全相同的代码无法编译吗?我错过了什么?

【问题讨论】:

  • @dyp "三元运算符的第三部分不能是赋值表达式" 为什么不呢?如果你适当地加上括号,它应该可以工作(但可能会让读者感到困惑)。

标签: c enums


【解决方案1】:

你的表达式被解析为:

( (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 &lt; second) ? myVar++ : myVar 不是 unary-expression(参见 C99 6.5.3)(但括号中的版本将是,正如我在我的第一个代码 sn-p 中所写,参见C99 6.5.1)。

HTH

【讨论】:

  • 你说得对,我的表达没有按照我的预期进行解析。有点棘手的 imo 这一定是人们说避免三元的原因之一。顺便说一句,HTH 是什么?
  • @Asics:“希望这会有所帮助”。还有一件事:注意,三元运算符的第二个操作数是表达式,而不是条件表达式,所以myVar&gt;=second ? myVar=last : myVar++ 有效……
【解决方案2】:

你所做的和你尝试做的没有可比性。

这个

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

翻译成

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

如果你想完全建立在副作用之上,你也可以这样做

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

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

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多