C语言 可选功能(切换不中断)


#include <stdio.h>
void main(void)
{
int price;
scanf("%d", &price);

switch (price)
{
case 1000: // what i want - case pay >= 1000
// code (no break - intentional)
case 500: // ....... - case pay >= 500
// code

default:
break;
}
}

我是新手。在没有break的情况下,是否有替代switch的方法,并且可以在switch中使用比较,而不是常数?

只是一系列if语句:

if (price >= 1000) {
// do something
}
if (price >= 500) {
// do some more stuff
}
  • 你可能也想用#define来代替那些神奇的数字(1000, 500 ...)。或者使用enum枚举它们。
  • 虽然switch()看起来像一个函数,但它是一个语句块。

正如其他人所说,这个问题更适合于连续的if块,而不是switch语句(在C编程界,故意使用省略是不受欢迎的)。

然而,如果你想把一个数字分成固定大小的块范围(在你的例子中,这个大小是500),那么你可以把你的数字除以那个块大小,并把结果用作switch变量。另外,注意default大小写不一定是最后的大小写——它可以是任何地方,甚至是第一个。

在下面的例子中,由于漏接(即在任何case块中都没有break;语句),case 0:代码将对任何输入运行;对于小于500的输入(即整数除法将得到0),这个案例将被执行。对于500到999范围内的数字(除法将得到1),case 1case 0代码将运行;对于数字>= 1000,将运行default案例,然后运行其他两个区块。(此代码要求price为正值!)

#include <stdio.h>
int main(void)
{
int price = 0;
printf("Price: ");
int s = scanf("%d", &price);
if (s != 1 || price < 0) {
printf("Invalid price!n");
}
else {
switch (price / 500) {
default:
printf("Price is >= 1000!n");
case 1:
printf("Price is >= 500n");
case 0:
printf("Price is anythingn");
}
}
return 0;
}

正如我所说的,我通常不建议在这种情况下使用switch;但是,尽管有这个建议,实际上很容易添加额外的块/条件,例如在1000 - 1499范围内的价格代码,您可以在代码中插入一个case 2:块。此外,当'范围'的数量变得足够大时(例如,超过3),那么可以说使用这样的switch而不是if语句/块链变得更加清晰。


注意:为了增加清晰度-如果你的编译器支持它(clang和gcc做,但我不知道MSVC的等效)-然后你可以添加__attribute__((fallthrough));语句,无论你依赖于任何(隐含的)下降,尽管从一个情况块到下一个。在上面所示的代码中,这样的语句将被添加到紧接case 1:case 0:标签之前。

使用链式if … else语句:

if (1000 <= price)
{
// Things for price 1000 or more.
}
else if (500 <= price)
{
// Things for price 500 or more.
}
else
{
// Things for other cases.
}

最新更新