【问题标题】:Behavior of conditional statement in the body of switch case (C language) [closed]switch case 主体中条件语句的行为(C 语言)[关闭]
【发布时间】:2020-01-01 16:10:21
【问题描述】:

下面的代码 sn-p 可以正常工作,但是如果我想在条件语句的第二部分为 retv 赋值,则会引发编译器错误。我正在使用 GCC C 编译器。 谁能解释一下为什么?

代码

typedef enum {
mt1 = 23,
mt2 = 43,
mt3 = 53
} mts;

int getmt(mts value, int sign) {
    int retv = -1;
    switch(value) {
        case mt1: sign == 0? retv=1 : retv; //ERROR if retv=0 
                  break;
        case mt2: break;
        case mt3: break;
        default: break;
    }
    return retv;
}
int main(void)
{
    printf("val:%d\n", getmt(mt1, 0));
    printf("val:%d\n", getmt(mt2, 0));
    return 0;
}

错误

error: lvalue required as left operand of assignment
         case mt1: sign == 0? retv=1 : retv=0; break;

【问题讨论】:

  • 为什么使用三态运算符代替if?它会损害可读性,并且不会使其更快或更好。
  • 三元运算符被过度使用,它使代码更难阅读、理解和维护。请改用正确的if 语句。如果我正确理解您的代码,您想要的只是if (sign == 0) retv = 1;
  • 条件表达式retv=(sign==0)?1:retv;
  • 顺便说一下,您的错误信息与您显示的代码不匹配!重要的是要确保您向我们展示了一个正确的minimal reproducible example,它复制了您得到的错误,并展示了将该代码与来自该确切代码的完整和完整的错误输出(复制粘贴为文本)一起使用。请阅读how to ask good questions,以及this question checklist

标签: c ternary-operator operator-precedence assignment-operator conditional-operator


【解决方案1】:

这是因为三元条件的运算符优先级高于=。它将像这样编译:

case mt1: sign == 0 ? (retv = 1) : (retv = 0);

【讨论】:

  • retv = 0 改变了语义,我认为目的是在这种情况下保持 retv 不变。
  • 我认为这是 OP 的意图。鉴于//ERROR if retv=0 的评论,我认为他希望它是那样的,但它不会那样编译。不过,我可能会误解这一点。
【解决方案2】:

在 C 和 C++ 中定义条件运算符是有区别的。

在 C 中,运算符的定义如下

logical-OR-expression ? expression : conditional-expression

条件运算符的优先级高于赋值运算符。

因此这个表达式语句

sign == 0? retv = 1 : retv = 0;

像这样处理

( sign == 0? retv = 1 : retv ) = 0;

为了避免错误你可以把原来的表达式改写得更简单

retv = sign == 0? 1 : 0;

甚至更简单

retv = sign == 0;

在 C++ 中,此运算符的定义类似于

logical-or-expression ? expression : assignment-expression

所以在 C++ 中这个表达式语句

sign == 0? retv = 1 : retv = 0;

将是有效的。:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2013-09-24
    • 2011-08-18
    相关资源
    最近更新 更多