为什么允许多个分号?

时间:2013-07-20 12:20:06

标签: c#

考虑以下代码:

myBusiness business = new myBusiness();
business.DoWork(); ; ; ; ; ; ;

为什么我们可以使用多个分号?这是编译器中的错误吗?

6 个答案:

答案 0 :(得分:29)

这是因为分号在单独使用时代表空语句

documentation说:

  

空语句由单个分号组成。它什么都不做   并且可以在需要声明但没有动作的地方使用   需要进行。

并提供以下示例:

void ProcessMessages()
{
    while (ProcessMessage())
        ; // Statement needed here.
}

当然,您可以按顺序执行任意数量的空语句,但不会发生任何事情。

答案 1 :(得分:7)

Semicolumn是一个空话,意思是“什么都不做”。 需要乘法半列时的典型示例是无限循环

  for (int i = 0; i < count; ++i) { // <- ordinary for
    ...
  }

  for (;;) { // <- infinite (for) loop with no initialization, check and increment 
    ...
  }

答案 2 :(得分:3)

空语句在所有C语言中都有效。最常见的习惯用法是在for语句中,例如:

for (; ; )
{
}

OR

while (Method())
   ;

OR

void F() {
   //...
   if (done) goto exit;
   //...
   exit: ;
}

OR

if (true)
 {
      ;
 }

OR

if (true)
    ;

所有陈述均有效。

答案 3 :(得分:1)

;只是一个行终止符,它告诉编译器这个语句结束了。 如果在一行中使用多个;,编译器会认为它们是多个语句。

答案 4 :(得分:1)

单独使用分号代表empty statement

另外,请参阅这里的答案 - Legal to allow multiple semicolons,并详细解释为什么它完全合法。请参阅针对宏解释的 Binary Worrier 的回答。

从该帖子 -

您可以将宏重新定义为与其初始定义不同,也可以重新定义它们,使它们根本不存在。

给定一个断言宏#define ASSERT(c) if(!c) throw new AssertionFailedException(),您可以使用ASSERT语句填充您的编码。

void Foo(int x) {
    int y = x + 2;
    ASSERT(y != 0);
   int z = x / y;
    . . . .
}

现在考虑您只想在调试版本中使用断言,而不是在发布版本中,为了释放,您将宏重新定义为空(literally #define ASSERT)。现在,当Foo转到编译器进行发布构建时,它看起来像这样

void Foo(int x) {
    int y = x + 2;
    ;
   int z = x / y;
    . . . .
}

现在有一个空语句,其中ASSERT是,因为那里可能有也可能没有语句(取决于构建配置),编译器需要能够处理空语句。

为什么这个约定保存在C#里,没有像C宏这样的东西,我不知道,但可能是因为它几乎没有造成伤害。

  

我猜多了;在它之前由编译器省略   开始解析代码,因此无法访问;被忽略了   编译器。

答案 5 :(得分:0)

';'代表空洞的陈述。

int a;;;;;; // this states that one statement and 5 empty statements 

所以这里没有错误。