替代功能(不间断切换)
Alternative function to (switch without break)
#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 … 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.
}
只是一系列 if
语句然后:
if (price >= 1000) {
// do something
}
if (price >= 500) {
// do some more stuff
}
- 您可能还想对那些幻数
(1000, 500 ...)
使用 #define
。或者使用 enum
. 枚举它们
- 虽然
switch()
看起来像一个函数,但它是一个语句块。
正如其他人所说,这个问题更适合连续的 if
块而不是 switch
语句(其中使用 deliberate fall-through 被 C 编程世界中的许多人 frowned-upon。
但是,如果您想将一个数字划分为 fixed-size 个块的范围(在您的情况下,该大小为 500),那么您可以将您的数字除以 block-size 并使用结果作为 switch
变量。另外,请注意 default
案例不一定是 final 案例——它可以在任何地方,甚至是第一个。
在下面的示例中,由于 fall-through(即任何 case
块中都没有 break;
语句),case 0:
代码将是 运行 用于 any 输入;对于小于 500 的输入(即 integer 除法将导致 0),only 将执行该案例。对于 500 到 999 范围内的数字(除法将得到 1),case 1
和 case 0
代码将 运行;并且,对于 >= 1000 的数字,default
案例将 运行,然后是其他两个块。 (此代码需要 price
的 positive 值!)
#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 >= 500\n");
case 0:
printf("Price is anything\n");
}
}
return 0;
}
正如我所说,在这种情况下(糟糕的双关语),我通常不建议使用 switch
;但是,尽管有这个建议,但实际上很容易添加额外的 blocks/conditions,例如 1000 - 1499 范围内的价格代码,您可以在代码中插入一个 case 2:
块。此外,当 'ranges' 的数量变得足够大(例如,超过 3 个)时, 可以说 会变得更清楚地使用这样的 switch
,而不是一串 if
statements/blocks.
注意:为了更加清楚——如果你的编译器支持它(clang 和 gcc 支持,但我不知道 MSVC 的等价物)——那么你可以在任何你依赖的地方添加 __attribute__((fallthrough));
语句(暗示)fall-though 从一个案例块到下一个案例块。在上面显示的代码中,将在 case 1:
和 case 0:
标签之前添加此类语句。
#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 … 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.
}
只是一系列 if
语句然后:
if (price >= 1000) {
// do something
}
if (price >= 500) {
// do some more stuff
}
- 您可能还想对那些幻数
(1000, 500 ...)
使用#define
。或者使用enum
. 枚举它们
- 虽然
switch()
看起来像一个函数,但它是一个语句块。
正如其他人所说,这个问题更适合连续的 if
块而不是 switch
语句(其中使用 deliberate fall-through 被 C 编程世界中的许多人 frowned-upon。
但是,如果您想将一个数字划分为 fixed-size 个块的范围(在您的情况下,该大小为 500),那么您可以将您的数字除以 block-size 并使用结果作为 switch
变量。另外,请注意 default
案例不一定是 final 案例——它可以在任何地方,甚至是第一个。
在下面的示例中,由于 fall-through(即任何 case
块中都没有 break;
语句),case 0:
代码将是 运行 用于 any 输入;对于小于 500 的输入(即 integer 除法将导致 0),only 将执行该案例。对于 500 到 999 范围内的数字(除法将得到 1),case 1
和 case 0
代码将 运行;并且,对于 >= 1000 的数字,default
案例将 运行,然后是其他两个块。 (此代码需要 price
的 positive 值!)
#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 >= 500\n");
case 0:
printf("Price is anything\n");
}
}
return 0;
}
正如我所说,在这种情况下(糟糕的双关语),我通常不建议使用 switch
;但是,尽管有这个建议,但实际上很容易添加额外的 blocks/conditions,例如 1000 - 1499 范围内的价格代码,您可以在代码中插入一个 case 2:
块。此外,当 'ranges' 的数量变得足够大(例如,超过 3 个)时, 可以说 会变得更清楚地使用这样的 switch
,而不是一串 if
statements/blocks.
注意:为了更加清楚——如果你的编译器支持它(clang 和 gcc 支持,但我不知道 MSVC 的等价物)——那么你可以在任何你依赖的地方添加 __attribute__((fallthrough));
语句(暗示)fall-though 从一个案例块到下一个案例块。在上面显示的代码中,将在 case 1:
和 case 0:
标签之前添加此类语句。