为什么允许使用多个分号
本文关键字:许使用 为什么 | 更新日期: 2023-09-27 18:24:13
考虑以下代码:
myBusiness business = new myBusiness();
business.DoWork(); ; ; ; ; ; ;
为什么我们可以使用多个分号?这是编译器中的错误吗?
这是因为分号单独使用时表示空语句。
文件上写着:
空语句由一个分号组成。它没有任何作用并且可以用于需要声明但不需要操作的地方需要执行。
并提供了以下示例:
void ProcessMessages()
{
while (ProcessMessage())
; // Statement needed here.
}
当然,您可以按顺序执行任意数量的空语句,不会发生任何事情。
半列是一个空语句,意思是"什么都不做"。当需要多个半列时,典型的例子是循环的无穷大
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)
;
所有声明均有效。
分号单独使用时表示空语句。
此外,请参阅此处的答案-Legal允许使用多个分号,并详细解释为什么它完全合法。请参阅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
所以这里面没有bug。