使用三元操作符的奇怪枚举行为

  • 本文关键字:枚举 操作符 三元 enums
  • 更新时间 :
  • 英文 :


我正在用我的枚举之一编写一个非常简单的三元操作符,我偶然发现了一个非常奇怪的错误(对我来说…)。给定这段代码:

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);

但我不确定这是一个好的风格,因为它可能会混淆读者对表达的意图

最新更新