开关状态的奇怪行为

  • 本文关键字:状态 开关 c
  • 更新时间 :
  • 英文 :


正如我在下面所知道的,代码应该抛出错误,它应该抛出错误。

错误

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只能返回两个值01。要有一些额外的值,你需要使它更复杂一点

switch(num1 > num2 ? 1 : (num1 == num2 ? 2 : 0))

开关内部的表达式将在num1 > num2时返回1,如果num1 == num2则返回2,如果num1 < num2则返回0

另一种形式:

switch((num1 > num2) * 1 + (num1 == num2) * 2)

最新更新