你误解了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