提问人:dts 提问时间:8/28/2019 最后编辑:Vlad from Moscowdts 更新时间:8/28/2019 访问量:79
开关正文中条件语句的行为(C语言)[已关闭]
Behavior of conditional statement in the body of switch case (C language) [closed]
问:
下面的代码片段可以正常工作,但是如果我想在条件语句的第二部分为 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;
答:
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;
将有效:)
评论
if
if
if (sign == 0) retv = 1;
retv=(sign==0)?1:retv;