GSi*_*GSi 2 c c++ switch-statement
可能这是一个愚蠢的问题,但有没有人知道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
}
Run Code Online (Sandbox Code Playgroud)
我的参考编译器都接受这个代码,一旦运行它就可以很好地工作.预处理器如何识别必须替换ZERO?
另请注意,如果控件表达式是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
}
Run Code Online (Sandbox Code Playgroud)
这个编译,但即使char_expression是'0' 的值,也没有caseZERO执行任何语句.
有谁能解释一下?
这些是与您一起使用的常规标签,goto并且实际上不会与您想要的表达式匹配.语法有效,但语义不同.
您没有指定这是C编译器还是C++编译器,因此这里也是C语言的文档goto.
另外,如果你查看附录A.2.3(6.8.1)中ISO C标准提供的实际语法,则定义一个带标签的语句如下:
(6.8.1)标签声明:
identifier : 声明
case constant-expression : statement
默认 : 声明
特别注意,这case是一个单一的标记,在语法的上下文中必须至少有一个标记分隔字符.甲标号在您的例子case1不能算作令牌分隔符,所以你的示例落入其为语法的第一支路标识符 不一个case语句,并且因此不能被用作一个目标switch的语句.
要回答关于ZERO在预处理器宏中定义的其他问题,替换不会像您所认为的那样发生.同样,预处理器对令牌进行操作,因此caseZERO是与ZERO宏不匹配的单个令牌,因此根本不会被替换.同样,这只是使用标识符分支定义标签语句,其中标识符是整个标记,而不是或您认为.预处理器确实有使用运算符进行"令牌粘贴"的方法,但这需要您使用.但是,这仍然没有您可能想要的行为.caseZEROcase0case'0'##case ## ZERO