【问题标题】:Larger than and less than in C switch statementC switch 语句中的大于和小于
【发布时间】:2014-01-07 12:59:57
【问题描述】:

我正在尝试编写一个有很多比较的代码

在“QUANT.C”中编写一个“量化”数字的程序。读取一个整数“x”并测试它,产生 以下输出:

x 大于或等于 1000 打印“非常积极”
x 从 999 到 100(包括 100)打印“非常积极”
x 介于 100 和 0 之间,打印“正数”
x 正好 0 打印“零”
x 介于 0 和 -100 之间,打印“负数”
x 从 -100 到 -999(包括 -100)打印“非常负面”
x 小于等于 -1000 打印“非常负”

因此,-10 将打印“负面”、-100 “非常负面”和 458 “非常正面”。

然后我尝试使用 switch 语句来解决它,但它不起作用。我必须使用if 语句来解决它,还是有一种方法可以使用 switch 语句来解决它?

#include <stdio.h>

int main(void)
{
    int a=0;
    printf("please enter a number : \n");

    scanf("%i",&a);

    switch(a)
    {
        case (a>1000):
            printf("hugely positive");
            break;

        case (a>=100 && a<999):
            printf("very positive");
            break;

        case (a>=0 && a<100):
            printf("positive");
            break;

        case 0:
            printf("zero");
            break;

        case (a>-100 && a<0):
            printf("negative");
            break;

        case (a<-100 && a>-999):
            printf("very negative");
            break;

        case (a<=-1000):
            printf("hugely negative");
            break;

    return 0;
}

【问题讨论】:

  • switch 只能处理具有恒定整数值的精确比较。您必须使用ifelse
  • 七个编译错误应该告诉你一些事情(和1个警告:control reaches end of non-void function)。
  • 在你的问题定义中没有提到只使用 switch case。如果还有其他方法!

标签: c if-statement comparison switch-statement


【解决方案1】:

没有干净的方法可以用 switch 解决这个问题,因为 case 需要是整数类型。看看 if-else if-else。

【讨论】:

    【解决方案2】:

    无开关 if-else-less 方法:

    #include <stdio.h>
    
    int main(void)
    {
        int a=0, i;
        struct {
            int value;
            const char *description;
        } list[] = {
            { -999, "hugely negative" },
            { -99, "very negative" },
            { 0, "negative" },
            { 1, "zero" },
            { 100, "positive" },
            { 1000, "very positive" },
            { 1001, "hugely positive" }
        };
    
        printf("please enter a number : \n");
        scanf("%i",&a);
    
        for (i=0; i<6 && a>=list[i].value; i++) ;
        printf ("%s\n", list[i].description);
    
        return 0;
    }
    

    for 循环不包含任何代码(只有一个空语句 ;),但它仍会在具有值的数组上运行并在输入的值 a 等于或大于 value 元素时退出在数组中。此时,i 保存了要打印的description 的索引值。

    【讨论】:

    • 如果您一步一步解释,我将不胜感激,无论如何,谢谢
    • for 循环是最重要的——使用调试器,或者用笔和纸完成它。好吧,那,以及对描述列表中相等运算符的一致处理。
    • 刚刚偶然发现了这个话题并找到了这个答案。如果输入的数字低于-999,解决方案不起作用
    • @AlexG:对于小于最小值的值,没有description,并且添加一个需要依次添加一个边界值。也许它所需要的只是INT_MIN,而不是任意的-999。 (我明白了,类似于anatolyg's answer 使用INT_MAX 在另一端强制关闭上限。)
    【解决方案3】:

    如果你使用 gcc,你有“运气”,因为它通过使用语言扩展来支持你想要的:

    #include <limits.h>
    ...
    
    switch(a)
    {
    case 1000 ... INT_MAX: // note: cannot omit the space between 1000 and ...
        printf("hugely positive");
       break;
    case 100 ... 999:
        printf("very positive");
       break;
    ...
    }
    

    虽然这是非标准的,其他编译器将无法理解您的代码。人们经常提到,您应该只使用标准功能(“可移植性”)编写程序。

    因此考虑使用“流线型”if-elseif-else 构造:

    if (a >= 1000)
    {
        printf("hugely positive");
    }
    else if (a >= 100)
    {
        printf("very positive");
    }
    else if ...
    ...
    else // might put a helpful comment here, like "a <= -1000"
    {
        printf("hugely negative");
    }
    

    【讨论】:

    • 为什么其他编译器不理解在​​ switch 语句中使用省略号(导致“非标准”)?
    【解决方案4】:

    (a&gt;1000) 计算结果为 1 [true] 或 0 [false]。

    编译会报错:

    test_15.c:12: error: case label does not reduce to an integer constant
    

    这意味着,您必须为 case 标签使用 integer constant 值。在这种情况下,If-else if-else 循环应该可以正常工作。

    【讨论】:

    • a>1000 计算为布尔值而不是整数 1 或 0。
    【解决方案5】:

    用途:

    switch (option(a)) {
        case (0): ...
        case (1): ...
        case (2): ...
        case (n): ...
    

    option() 函数只是带有if else 的函数。

    它可以让您保持开关的简洁外观,而逻辑部分则在别处。

    【讨论】:

      【解决方案6】:

      您为什么偏爱使用 switch?

      我之所以这么问,是因为这听起来很像一个“家庭作业问题”。编译器应该像处理开关一样有效地处理 if/else 构造(即使您没有处理范围)。

      Switch 无法像您显示的那样处理范围,但您可以通过首先对输入进行分类(使用 if/else)然后使用 switch 语句输出答案来找到包含 switch 的方法。

      【讨论】:

        【解决方案7】:

        将类型参数模式与 when 子句一起使用 例如

        switch(a)
            {
                case * when (a>1000):
                    printf("hugely positive");
                    break;
                case * when (a>=100 && a<999):
                    printf("very positive");
                    break;
                case * when (a>=0 && a<100):
                    printf("positive");
                    break; }
        

        【讨论】:

        • 这是无效的 C.
        猜你喜欢
        • 2011-10-03
        • 2018-09-27
        • 1970-01-01
        • 2015-10-17
        • 2015-07-29
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多