17
int main()
{
  int var = 0;; // Typo which compiles just fine
}
4

11 回答 11

34

定义时怎么assert(foo == bar);编译成空NDEBUG

于 2009-05-05T12:01:46.037 回答
13

这是 C 和 C++ 表达NOP的方式。

于 2009-05-05T12:04:43.283 回答
9

我不是语言设计师,但我给出的答案是“为什么不呢?” 从语言设计的角度来看,人们希望规则(即语法)尽可能简单。

更不用说“空表达式”有用途,即

对于 (i = 0; i < INSANE_NUMBER; i++);

将死等待(不是一个很好的用途,但仍然有用)。

编辑:正如对此答案的评论中指出的那样,任何值得其盐的编译器都可能不会忙于等待这个循环,并将其优化掉。但是,如果在 for 头本身(除了 i++)中有更有用的东西,我已经看到(奇怪地)通过数据结构遍历完成,那么我想你仍然可以构造一个空主体的循环(通过使用 /滥用“for”结构)。

于 2009-05-05T11:46:19.897 回答
9

你希望能够做类似的事情

while (fnorble(the_smurf) == FAILED)
    ;

并不是

while (fnorble(the_smurf) == FAILED)
    do_nothing_just_because_you_have_to_write_something_here();

但!请不要在同一行写空语句,如下所示:

while (fnorble(the_smurf) == FAILED);

这是混淆读者的好方法,因为很容易错过分号,因此认为下一行是循环的主体。请记住:编程实际上是关于交流——不是与编译器,而是与其他将阅读您的代码的人。(或者和自己一起,三年后!)

于 2009-05-05T12:18:46.433 回答
9

好的,我将把它添加到您可能实际使用的最坏情况中:

for (int yy = 0; yy < nHeight; ++yy) {
    for (int xx = 0; xx < nWidth; ++xx) {
        for (int vv = yy - 3; vv <= yy + 3; ++vv) {
            for (int uu = xx - 3; uu <= xx + 3; ++uu) {
                if (test(uu, vv)) {
                    goto Next;
                }
            }
        }
    Next:;
    }
}   
于 2011-12-10T20:26:28.093 回答
8

显然,我们可以这样说

for (;;) {
  // stuff
}

没有那个谁能活?

于 2009-05-05T11:49:48.453 回答
8

老实说,我不知道这是否是真正的原因,但我认为更有意义的是从编译器实现者的角度来考虑它。

大部分编译器是由分析特殊语法类的自动化工具构建的。有用的语法允许空语句似乎很自然。当它不改变代码的语义时,检测这样的“错误”似乎是不必要的工作。空语句不会做任何事情,因为编译器不会为这些语句生成代码。

在我看来,这只是“不要修复没有损坏的东西”的结果......

于 2009-05-05T11:58:40.647 回答
2

最常见的情况可能是

int i = 0;
for (/* empty */; i != 10; ++i) {
    if (x[i].bad) break;
}
if (i != 10) {
    /* panic */
}
于 2009-05-05T11:48:01.983 回答
2

使用时;,还请注意一件事。还行吧:

a ? b() : c();

但是,这不会编译:

a ? b() : ; ;
于 2015-03-04T17:32:09.270 回答
1

已经有很多好的答案,但还没有看到生产环境样本。

是 FreeBSD 的实现strlen

size_t
strlen(const char *str)
{
    const char *s;

    for (s = str; *s; ++s)
        ;
    return (s - str);
}
于 2018-06-10T06:04:10.173 回答
0
while (1) {
    ;  /* do nothing */
}

有时你想坐着什么也不做。事件/中断驱动的嵌入式应用程序或当您不希望函数退出时,例如在设置线程和等待第一次上下文切换时。

例如: http: //lxr.linux.no/linux+v2.6.29/arch/m68k/mac/misc.c#L523

于 2009-05-05T11:48:17.990 回答