【发布时间】:2015-02-26 17:23:45
【问题描述】:
这可能是一个愚蠢的问题,但是否有人已经知道case 关键字与其在switch 语句中的常量表达式之间是否存在强制空格?
标准似乎没有说明...
考虑以下代码:
switch(int_expression)
{
case1: /*anything*/ // no space before 1
caseZERO: /*anything*/ // no space before ZERO
// ZERO being defined as 0
// by the pre-processor
}
我的两个参考编译器都接受此代码,并且一旦运行它就可以很好地工作。 预处理器如何识别必须替换零?
另请注意,如果控制表达式是 char 类型而不是 int 类型,则以下内容也会被编译,但这次不再有效
switch(char_expression)
{
case'a': /* anything */ // NO SPACES embedded
caseZERO: /* anything */ // NO SPACES again
// ZERO being defined as '0'
// by the pre-processor
}
这个编译但是即使char_expression 的值是'0'
caseZERO 中没有任何语句被执行。
谁能解释一下?
【问题讨论】:
-
标识符后跟冒号也是标签(用于 goto)。我敢打赌这就是
caseZERO在这种情况下的含义。我还希望控制它的规则在定义什么是令牌的部分中,并且语法需要一个令牌case,但得到一个令牌caseZERO。出于同样的原因,ZERO也没有展开。但我不是标准方面的专家,所以我会让其他人回答。 -
有趣。我想知道标准对没有案例标签的开关有什么看法
-
@sp2danny:它可能允许它们,但会跳过 switch 语句/块——类似于 if (0)
-
为了让编译器识别
case,需要用空格将case与其值分开。正如其他人所说,没有空格,标识符被视为标签(例如,对于goto语句)。 -
@sp2danny:这完全有效,语法是
switch ( expression ) statement,甚至switch(0);也是一个有效的空操作。
标签: c++ c switch-statement