# 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
答案 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
设置为1
。 case 'x':
和case 'y':
都不匹配1
(在基于ASCII的大多数代码集中,它们等同于case 120:
和case 121:
),并且没有{{} 1}},因此跳过default
,输出为switch
(不是,如您所见,1 2
)。
什么是编译时常量?
在编译代码时,编译器必须可以确定case标签中的值,并且必须是常量表达式。这意味着case标签中的表达式不能引用变量或函数,但它们可以对固定(整数)值使用基本计算。
假设:
2 2
答案 2 :(得分:2)
您不能在case
中使用变量,因为值必须是编译时常量。此外,您的代码不正确,因为'x'
和'y'
是常量(文字),因此不会引用变量x
和y
。
答案 3 :(得分:2)
在引号中使用'x'实际上是使用字符x的常量ASCII代码值,实际上是数字值120(根据ASCII图表)。它不使用您声明的变量。