为什么是some_statement ;;;; 在C++中有效吗?

Cod*_*own 2 c++ gcc g++ c++11

我正在学习C++并且不小心写了

string s = "Some String";;;;
Run Code Online (Sandbox Code Playgroud)

无论有多少个冒号,编译器都不会抱怨.除了编译器所说的if块之外,它几乎适用于所有语句

 ‘else’ without a previous ‘if’ 
Run Code Online (Sandbox Code Playgroud)

我正在使用GCC 4.7

Esc*_*alo 13

以下是C++语法的一部分:

expressionopt ;

下标opt表示这expression是可选的.

另一方面,该if陈述的语法是:

if ( condition ) statement

并且不是有效的.expressionopt ;condition

  • 我认为你解释`表达式?;`在这种情况下是不正确的条件不正确.if()在else之前只需要一个语句,所以`if(..); else返回;`是正确的但是`if(...);; else return;`不是. (3认同)

Jer*_*fin 6

C++语法(比之前的C语言)允许使用null语句.在某些情况下,它们实际上甚至是有用的.一种情况是将所有动作置于条件中的循环,因此循环体不需要做任何事情.一个典型的例子是C strcpy函数的实现:

while (*d++ = *s++)
    ;
Run Code Online (Sandbox Code Playgroud)

当你这样做时,你通常想要像这样将分号放在一行上,而不是在同一行的末尾,比如while (*d++ = *s++);.编译器不关心差异,但将它放在一个单独的行上有助于向读者保证只有一个空语句的循环是故意的.有些人也喜欢添加评论,例如:

while (*d++ = *s++)
   /* intentional null statement */ ;
Run Code Online (Sandbox Code Playgroud)

就个人而言,我认为一行上的分号本身就足够了,但这就是生活.


AnT*_*AnT 6

要添加其他答案中未提及的内容:

;;;在一般情况下,这个序列代表什么将取决于使用它的上下文.

如果你宣布

string s = "Some String";;;;
Run Code Online (Sandbox Code Playgroud)

本地范围内(即在函数内部),那么你上面的变量是一个声明语句,s而过多的;s将代表空语句,因为已经在其他答案中说明了.这在C++中一直是合法的.

但如果你这样做

string s = "Some String";;;;
Run Code Online (Sandbox Code Playgroud)

命名空间范围内,那么过多的;s不再代表空语句.命名空间范围中不允许使用语句.你上面的内容是变量的声明(不是声明声明,但仅仅是声明)s,后面是一系列空声明.在C++ 11之前,空声明在C++语言中曾经是非法的,这意味着在C++ 98和C++ 03中,如果在命名空间范围内使用,上述声明确实会产生语法错误.

如果在范围中使用上述声明,那么由于其他原因它在C++ 98和C++ 03中立即是非法的:它包含一个初始化程序,在C++ 11之前的语言版本中是不允许的.在C++ 11中,包括类范围声明中的初始化程序变得合法.在这种情况下,序列;;;也是一系列空声明,而不是一系列空语句.