#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 1
和case 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.
}