对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;
}