正如我在下面所知道的,代码应该抛出错误,它应该抛出错误。
错误
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 greatestn",num2 );
break;
case 1:
printf("%d is the greatest n",num1 );
break;
default:
printf("both are equalln");
break;
}
但是如果删除默认情况,那么它可以在没有任何错误的情况下工作
int num1, num2;
scanf("%d%d", &num1, &num2);
switch(num1 > num2)
{
case 0:
printf("%d is greatestn",num2 );
break;
case 1:
printf("%d is the greatest n",num1 );
break;
}
如果有人能澄清删除默认情况的原因,那就太好了。
我认为这是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 greatestn",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
时返回1
,如果num1 == num2
则返回2
,如果num1 < num2
则返回0
另一种形式:
switch((num1 > num2) * 1 + (num1 == num2) * 2)