繁体   English   中英

开关条件的奇怪行为

[英]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只能返回两个值01 要获得一些额外的值,您需要使它更复杂一些

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

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

另一种形式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM