开关正文中条件语句的行为(C语言)[已关闭]

Behavior of conditional statement in the body of switch case (C language) [closed]

提问人:dts 提问时间:8/28/2019 最后编辑:Vlad from Moscowdts 更新时间:8/28/2019 访问量:79

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

4年前关闭。

下面的代码片段可以正常工作,但是如果我想在条件语句的第二部分为 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;
C 三元运算符 条件 运算符

评论

1赞 Marco Bonelli 8/28/2019
为什么使用三态运算符代替 ?它损害了可读性,并没有使它更快或更好。if
1赞 Some programmer dude 8/28/2019
三元运算符被过度使用,它使代码更难阅读、理解和维护。请改用适当的语句。如果我正确理解了你的代码,你想要的只是ifif (sign == 0) retv = 1;
3赞 wildplasser 8/28/2019
条件表达式retv=(sign==0)?1:retv;
4赞 Some programmer dude 8/28/2019
顺便说一句,您的错误消息与您显示的代码不匹配!请务必确保我们向我们展示一个适当的最小可重现示例,该示例复制了您得到的错误,并展示了使用该代码以及该确切代码的完整错误输出(复制粘贴为文本)。请阅读如何提出好问题,以及这个问题清单

答:

3赞 Blaze 8/28/2019 #1

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

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

评论

0赞 Some programmer dude 8/28/2019
retv = 0更改语义,我认为目的是在这种情况下保持不修改。retv
2赞 Blaze 8/28/2019
我认为这是OP的意图。鉴于评论,我认为他希望它像那样,但它不会以这种方式编译。不过,我可能误解了这一点。//ERROR if retv=0
2赞 Vlad from Moscow 8/28/2019 #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;

将有效:)