C 开关条件的奇异行为

C 开关条件的奇异行为,c,C,正如我在下面所知道的,代码应该抛出错误,它也应该抛出错误 错误 测试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 );

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

错误

测试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;

}
如果任何人都能清楚地知道,如果删除默认案例,它为什么会起作用,那就太好了


我认为这是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) -> 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
时,开关内的表达式将返回
1
2
如果
num1==num2
0
如果
num1

另一种形式:

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

表达式
num1>num2
只能返回两个值
0
1
。要获得一些附加值,需要将其变得更复杂一些

switch(num1 > num2 ? 1 : (num1 == num2 ? 2 : 0))
num1>num2
时,开关内的表达式将返回
1
2
如果
num1==num2
0
如果
num1

另一种形式:

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

这最多会产生一个警告(除非警告升级为错误),它会发出警告<代码>警告:switch条件具有布尔值[-Wswitch bool]
@Paulo,这两个代码段都具有布尔值。使用带有布尔值的switch语句不是最好的选择。@scarandeu感谢您的响应。我知道在切换条件下使用布尔值不是一个好主意。也知道这里默认是无用的,但我的问题是,如果不使用默认,为什么没有错误。这最多应该会产生一个警告(好吧,除非有人将警告升级为错误),它会发出警告<代码>警告:switch条件具有布尔值[-Wswitch bool]
@Paulo,这两个代码段都具有布尔值。使用带有布尔值的switch语句不是最好的选择。@scarandeu感谢您的响应。我知道在切换条件下使用布尔值不是一个好主意。也知道这里的默认值是无用的,但我的问题是,如果不使用默认值,为什么没有错误。
default
在这种情况下是没有意义的,因为布尔值是0或1,并且您涵盖了这两种情况。请发布实际消息。首先,使用带有布尔表达式的开关是一个糟糕的主意。用
if/else
直接编写代码:这样会更具可读性,而且您不必处理此类警告。经验法则:如果你得到任何警告,很可能你做了一些奇怪的事情。@machine\u 1谢谢你的回复。我知道这里的默认值是无用的,但我的问题是,如果不使用默认值,为什么没有错误。
default
在这种情况下是没有意义的,因为布尔值是0或1,并且您涵盖了这两种情况。请发布实际消息。首先,使用带有布尔表达式的开关是一个糟糕的主意。用
if/else
直接编写代码:这样会更具可读性,而且您不必处理此类警告。经验法则:如果你得到任何警告,很可能你做了一些奇怪的事情。@machine\u 1谢谢你的回复。我知道这里的默认值是无用的,但我的问题是,如果不使用默认值,为什么没有错误。