替代功能(不间断切换)

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 案例将 运行,然后是其他两个块。 (此代码需要 pricepositive 值!)

#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: 标签之前添加此类语句。