3
# 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

4 回答 4

10

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

而且,case 'x':不要引用变量,而是引用一个 charx常量。'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;
}
于 2013-07-10T21:20:50.663 回答
8

你误解了switch陈述。

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

在您的代码中,您已var设置为1. 既不case 'x':也不case 'y':匹配1(它们等同于case 120:case 121:在大多数基于 ASCII 的代码集中),并且没有default,因此switch跳过了,输出为1 2(不是,正如您所期望的那样2 2)。

什么是编译时常量?

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

鉴于:

#include <math.h>
const int x = 3;               // C++ compilers treat this differently
enum { BIG_TIME = 60 };
#define HOURS(x) (3600 * (x))

case sin(x):     // Invalid - function of a variable
case x:          // Invalid - variable
case sin(0.0):   // Invalid - function
case 'x':        // Valid - character constant
case 'xy':       // Valid but not portable
case BIG_TIME:   // Valid - enumeration value names are constant
case HOURS(2):   // Valid - expands to (3600 * (2)) which is all constant
于 2013-07-10T21:17:16.453 回答
2

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

于 2013-07-10T21:16:47.497 回答
2

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

于 2013-07-10T21:21:17.377 回答