为什么允许多个分号?

考虑以下代码:

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

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

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

文件说:

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

并提供以下示例:

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

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

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

  for (int i = 0; i < count; ++i) { // <- ordinary for ... } for (;;) { // <- infinite (for) loop with no initialization, check and increment ... } 

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

 for (; ; ) { } 

要么

 while (Method()) ; 

要么

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

要么

 if (true) { ; } 

要么

 if (true) ; 

所有声明均有效。

单独使用分号表示空语句 。

另外,请参考这里的答案 – 允许多个分号的法律,以及为什么它完全合法的详细解释。 请参阅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宏这样的东西,我不知道,但可能是因为它几乎没有造成伤害。

我猜多了; 在开始解析代码之前,编译器会将其删除,因此无法访问; 被编译器忽略。

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

‘;’ 代表空洞的陈述。

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

所以这里没有错误。