3

考虑这段代码:

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

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

4

6 回答 6

29

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

文档说:

空语句由一个分号组成。它什么都不做,可以用在需要声明但不需要执行操作的地方。

并提供以下示例:

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

当然,你可以按顺序执行任意多的空语句,什么都不会发生。

于 2013-07-20T12:22:45.567 回答
7

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

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

  for (;;) { // <- infinite (for) loop with no initialization, check and increment 
    ...
  }
于 2013-07-20T12:30:00.927 回答
3

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

for (; ; )
{
}

或者

while (Method())
   ;

或者

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

或者

if (true)
 {
      ;
 }

或者

if (true)
    ;

所有声明均有效。

于 2013-07-20T12:42:40.613 回答
1

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

于 2013-07-20T12:25:35.310 回答
1

单独使用分号表示空语句

另外,请参阅此处的答案 -合法以允许多个分号,并详细解释为什么它完全合法。请参阅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# 中,我不知道,但可能是因为它造成的伤害很小或没有。

我猜是多个;在开始解析代码之前被编译器忽略,因此您无法访问;被编译器忽略。

于 2013-07-20T12:35:35.853 回答
0

';' 代表空语句。

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

所以这没有错误。

于 2013-07-20T12:55:01.307 回答