switch语句可以使用变量吗?

4

下面的代码声明了两个整型变量,并试图在 switch 语句中使用它们。这在 C++ 中是合法的吗?如果不是,为什么?

以下是代码示例:
int i = 0;
int x = 3;
switch (i)
{
    case x:
    // stuff
    break;

    case 0:
    // other stuff
    break;
}

2
你可以在 switch 中提供任何表达式,例如 i 或者 i * 2 等等都可以,但是 case 的值必须是编译时常量表达式,所以你的 x 不合法,但是 0 是合法的。 - Tony Delroy
如果在 switch case 之前将 x 重新赋值为 0,会发生什么? - Bryan Chen
“CASE”不会通过指针或变量分配任何内存引用。当您说:case x:时,这告诉switch语句我有一个名为“X”的值,并且我期望输入的值是X或字符串“X”。它只期望任何值,例如字符串、整数、浮点数或双精度浮点数,并且将在不引用任何内存位置的情况下处理它。 - Juniar
2
@Juniar“期望任何值,如字符串、整数、浮点数或双精度”- switch 仅适用于整数类型...即 boolchar、[short/long] [unsigned] int、一个 enum 或者可以在上下文中隐式转换为其中任何一种的类,但不包括任何类型的字符串、floatdouble - Tony Delroy
@TonyD 所以你仍然可以发出字符串值,例如颜色:红色、蓝色、绿色等。但是只能在 switch 语句之前使用枚举声明。 - Juniar
@Juniar:它们是枚举器的标识符,而不是用于运行时文本内容的“字符串”。 - Tony Delroy
2个回答

6
“case”标签必须是一个“整数常量表达式”,因此你的示例无效。但是如果将“x”更改为:
const int x = 3;

如果内容有效,则为有效。

3

switch语句能使用变量吗?

可以。这是可行的。

int i = 0;
switch (i) {
}

但是,case语句不能使用变量(必须是常量)。
case 0:
  // first
  break;
case 1:
  // second
  break;
default:
  // other

但在C++中,一个变量可以是常量:-)。要求是case语句评估为整数常量表达式。因此,即使像case i + 3:这样的东西也是有效的,如果 i 声明为 const。或者在C++11中,case g():,前提是 g 被定义为 constexpr - James Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接