[英]Strange behavior of switch condition
正如我所知,下面的代码应该抛出错误,并且它应该抛出错误。
错误
test.c:6:1:警告:开关条件具有布尔值 [-Wswitch-bool] 开关(num1 > num2)
我正在使用 gcc 编译器。
int num1, num2;
scanf("%d%d", &num1, &num2);
switch(num1 > num2)
{
case 0:
printf("%d is greatest\n",num2 );
break;
case 1:
printf("%d is the greatest \n",num1 );
break;
default:
printf("both are equall\n");
break;
}
但是如果删除默认情况,那么它可以正常工作而不会出现任何错误
int num1, num2;
scanf("%d%d", &num1, &num2);
switch(num1 > num2)
{
case 0:
printf("%d is greatest\n",num2 );
break;
case 1:
printf("%d is the greatest \n",num1 );
break;
}
如果有人能在删除 default case 的情况下弄清楚为什么它会工作,那就太好了。
我认为这是 gcc 编译器的错误。
这种行为完全有道理。
表达式 num1 > num2 是一个布尔值,所以可能的值是 0 或 1,当你定义两者时,你定义了所有的可能性,所以默认语句没有意义。 所以看一下代码:
switch(num1 > num2) -> only 2 possible solutions: 0 or 1
case 0: -> This is the false value
...
case 1: -> This is the true value
...
default: -> We run out of possible values, so default is undefined.
如果你做这样的事情会更清楚:
int num1, num2;
scanf("%d%d", &num1, &num2);
if(num1 > num2)
{
printf("%d is greatest\n",num2 );
}
else
{
printf("%d is the greatest \n",num1 );
}
无论如何仍然无效,因为您没有考虑 num1 == num2
表达式num1 > num2
只能返回两个值0
或1
。 要获得一些额外的值,您需要使它更复杂一些
switch(num1 > num2 ? 1 : (num1 == num2 ? 2 : 0))
当num1 > num2
,switch 内部的表达式将返回1
,如果num1 == num2
则返回2
或num1 < num2
时返回0
另一种形式:
switch((num1 > num2) * 1 + (num1 == num2) * 2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.