对switch case语句使用变量 #包括 内部主(空) { int var=1,x=1,y=2; 开关(var) { 案例“x”: x++; 打破 案例“y”: y++; 打破 } printf(“%d%d”,x,y); 返回0; }

对switch case语句使用变量 #包括 内部主(空) { int var=1,x=1,y=2; 开关(var) { 案例“x”: x++; 打破 案例“y”: y++; 打破 } printf(“%d%d”,x,y); 返回0; },c,C,这里我没有得到所需的输出 有人能解释为什么吗 我的预期输出是:2,2您不能在案例中使用变量,因为值必须是编译时常量。另外,您的代码不正确,因为'x'和'y'是常量(文字),因此没有引用变量x和y,您误解了开关语句 switch语句将switch(expression)中的表达式(通常是一个简单变量)与各种case标签中一系列不同的编译时常量值进行比较,并在该标签之后执行代码。如果该值与任何明确的大小写标签不匹配,则使用默认标签(如果存在),或者如果没有默认标签,则跳过整个开关 在代码中,将var

这里我没有得到所需的输出 有人能解释为什么吗


我的预期输出是:2,2

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

,您误解了
开关
语句

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

在代码中,将
var
设置为
1
case'x':
case'y':
都不匹配
1
(在大多数基于ASCII的代码集中,它们相当于
case 120:
case 121:
),并且没有
默认值
,因此跳过
开关
,输出为
1 2
(并非如您所料,
2

什么是编译时常量

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

鉴于:

# 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;
}
#包括
CONST int x=3;//C++编译器对此进行不同处理
枚举{BIG_TIME=60};
#定义小时数(x)(3600*(x))
case sin(x)://无效-变量的函数
案例x://无效-变量
案例sin(0.0)://无效-函数
大小写“x”://有效-字符常量
案例'xy'://有效但不可移植
case BIG_TIME://Valid-枚举值名称为常量
案例小时数(2)://有效-扩展为(3600*(2)),这都是常量
在switch语句(在C中)中,不能在
情况下使用变量。必须使用常量

而且,
案例“x”:
不是指变量
x
,而是指一个常量
'x'
,它是一个字符。您不是在测试您似乎想要的东西……在本例中,您是在测试
案例121:
,其中121是字母“x”的ascii代码

您可以通过以下方式解决您的问题:

#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
#包括
#定义INIT_X 1
#定义INIT_Y 2
// ^^^^^^^^^^^^^
内部主(空)
{
int var=1,x=INIT_x,y=INIT_y;
//         ^^^^^^^^^^^^^^^^^^
开关(var)
{
案例INIT_X:
//   ^^^^^^
x++;
打破
案例初始:
//   ^^^^^^
y++;
打破
}
printf(“%d%d”,x,y);
返回0;
}

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

var
不是
x
y
,它是
1
。您期望的输出是什么?但是x的值为1,所以为什么我没有得到输出2,22,2是必需的output@Chaos也许是因为有人没有读过他们的K&R C书?(顺便说一句,不是我的反对票)@Chaos格式良好,有相当多的社区贡献。检查修订历史,特别是原始帖子。我也会投反对票。你能解释一下编译时间常数吗?如果我只使用x和y而不是“x”和“y”?即使某些编译器会接受它,它也不是一个C有效表达式。你认为呢e> 案例'xy':
有效吗?看来你在这里犯了一个错误。至少你会以这样的警告结束:
警告:多字符字符常量
…但是你是对的,它是一个常量;)@jonathan-非常感谢你的解释和帮助得到了你,谢谢你的帮助Pierre
# 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;
}