大于和小于C switch语句中

问题描述 投票:17回答:6

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

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

x大于或等于1000打印“非常正面”x从999到100(包括100)打印“非常肯定”x在100到0之间打印为“正”x正好0打印“零”在0到-100之间的x打印“负”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;
}
c if-statement comparison switch-statement
6个回答
9
投票

由于用例需要是整型,因此没有干净的方法可以解决此问题。看看if-else if-else。


7
投票

无开关 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的索引值。


5
投票

如果使用的是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");
}

2
投票

[(a>1000)的值为1 [true]或0 [false]。

编译,您将得到错误:

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

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


2
投票

用途:

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

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

它使您保持开关的外观,逻辑部分在其他位置。


0
投票

您为什么偏爱使用开关?

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

Switch无法处理您所显示的范围,但是您可以找到一种包括switch的方法,方法是先对输入进行分类(使用if / else),然后使用switch语句输出答案。

© www.soinside.com 2019 - 2024. All rights reserved.