使用变量用于switch case语句

时间:2013-07-10 21:13:22

标签: c

# include <stdio.h>

int main(void)
{
    int var=1, x=1, y=2;
    switch(var)
    {
        case 'x':
            x++;
            break;
        case 'y':
            y++;
            break;
    }
    printf("%d %d",x,y);
    return 0;
}

这里我没有得到所需的输出 任何人都可以解释为什么吗?

我的预期输出是:2,2

4 个答案:

答案 0 :(得分:9)

在switch语句中(在C中),您不能在case中使用变量。你必须使用常数。

而且,case 'x':不是引用变量x而是引用作为char的常量'x'。你没有测试你想要的东西......在这种情况下,你正在测试case 121:,其中121是字母'x'的ascii代码。

您可以使用以下内容解决问题:

# include <stdio.h>

#define INIT_X 1
#define INIT_Y 2
// ^^^^^^^^^^^^^

int main(void)
{
    int var=1, x=INIT_X, y=INIT_Y;
    //         ^^^^^^^^^^^^^^^^^^
    switch(var)
    {
        case INIT_X:
        //   ^^^^^^
            x++;
            break;
        case INIT_Y:
        //   ^^^^^^
            y++;
            break;
    }
    printf("%d %d",x,y);
    return 0;
}

答案 1 :(得分:8)

你误解了switch声明。

switch语句将switch (expression)中的表达式(通常是一个简单变量)与各种case标签中的一系列不同的编译时常量值进行比较,并在该标签之后执行代码。如果该值与任何明确的case标签都不匹配,则会使用default标签(如果存在),或者如果没有switch则跳过整个default标签} label。

在您的代码中,您var设置为1case 'x':case 'y':都不匹配1(在基于ASCII的大多数代码集中,它们等同于case 120:case 121:),并且没有{{} 1}},因此跳过default,输出为switch(不是,如您所见,1 2)。

  

什么是编译时常量?

在编译代码时,编译器必须可以确定case标签中的值,并且必须是常量表达式。这意味着case标签中的表达式不能引用变量或函数,但它们可以对固定(整数)值使用基本计算。

假设:

2 2

答案 2 :(得分:2)

您不能在case中使用变量,因为值必须是编译时常量。此外,您的代码不正确,因为'x''y'是常量(文字),因此不会引用变量xy

答案 3 :(得分:2)

在引号中使用'x'实际上是使用字符x的常量ASCII代码值,实际上是数字值120(根据ASCII图表)。它不使用您声明的变量。