Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么空表达式在C/C++;?_C++_C_Language Design - Fatal编程技术网

C++ 为什么空表达式在C/C++;?

C++ 为什么空表达式在C/C++;?,c++,c,language-design,C++,C,Language Design,我不是语言设计师,但我的答案是“为什么不呢?”从语言设计的角度来看,人们希望规则(即语法)尽可能简单 更不用说“空表达式”有用途,即 对于(i=0;i NDEUTG//C> >定义为“< /P> > P>这是C和C++ Express的方式。< /P> < P>你想做像之类的事情。 while (1) { ; /* do nothing */ } for (;;) { // stuff } 而不是 while (fnorble(the_smurf) == FAILED)

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

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

对于(i=0;i<疯狂数;i++)

Will dead wait(这不是一个好的用途,但仍然是一个用途)


编辑:正如在对这个答案的评论中所指出的,任何值得一试的编译器都可能不会在这个循环中忙着等待,并对它进行优化。然而,如果for head本身(而不是i++)中有更有用的东西,我已经看到它(奇怪地)通过数据结构遍历完成了,那么我想象您仍然可以使用空体构造一个循环(通过使用/滥用“for”构造)。

最常见的情况可能是

int main()
{
  int var = 0;; // Typo which compiles just fine
}
有时候你想坐着无所事事。事件/中断驱动的嵌入式应用程序,或者当您不希望函数退出时,例如在设置线程和等待第一次上下文切换时

例如:
显然,我们可以这样说

while (1) {
    ;  /* do nothing */
}
for (;;) {
  // stuff
}

没有它,谁能活下去?

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

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


在我看来,这仅仅是“不要修复未损坏的东西”的结果。…

否则
如何断言(foo==bar) > <代码> NDEUTG//C> >定义为“< /P> > P>这是C和C++ Express的方式。< /P> < P>你想做像

之类的事情。
while (1) {
    ;  /* do nothing */
}
for (;;) {
  // stuff
}
而不是

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);
for(int-yy=0;yy对于(int vv=yy-3;vv当使用
时,请注意一件事。这是可以的:

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:;
    }
}   
但是,这不会编译:

a ? b() : c();

已经有很多很好的答案,但还没有看到生产环境示例

FreeBSD是否实现了strlen

a ? b() : ; ;

“这真的是等待吗?编译器能优化循环吗?因为没有发生什么事情。好的问题。现在你提到它,我不知道。我只知道它应该。”:汤姆:好问题。至少在C++中,执行时间不是“可观察行为”的一部分。因此理论上我认为编译器可以对此进行优化。但是,如果我是易失性的,那么这种优化是被禁止的。DMR的原始C编译器(这就是这个语法的来源)它是一个递归下降编译器——这种编译器通常是手工编写的,所以我认为ToolD在这里不是问题。这几乎使这种情况更可能发生。如果你手工编写一个r.d.p,那么你就为语法中的每个产品编写一个函数,它们的工作是匹配下一段输入…如果表达式和其他内容组成了语句,并且表达式和其他内容最终都不会消耗任何输入(后面的分号除外),那么解析器将识别此类语句。Idk如果这是真正的原因,但这似乎是一种合理的推理方法。(我从来没有写过一个大的r.d.p.,但我以前写过一个)。我现在在看一个类似C语言的Yacc语法,空语句需要一个额外的规则,所以似乎正好相反。至少对于那个语法,对于那个语言,对于那个工具。你不需要那里的分号!你可以边写边写(1);是的,在某些情况下,您不需要“;”,但并非所有编译器都需要“;”。如果您缺少它,相当多的嵌入式编译器会对您大喊大叫。但是,在ANSI C语法中,它不是必需的,这一点是正确的。这对于预算紧张的微控制器系统至关重要。@jpinto3912:事实上
w我几乎肯定会编译成完全没有指令,而不是目标平台的
NOP
指令。我对此表示怀疑。更可能是一个内在的,或asm。没有指令!=NOP。让你的手放在一个定时器计数很低的微控制器上,很快你就会想利用NOP指令…在C上用;实现(这种情况下不太可能使用C++语言)@R.A.A;;在编译器优化之前不是空的:它是NOP。@jpinto:我想你误读了我的评论。这不是一个好例子,因为,例如,第二个分号不是用来结束一个语句的。for的第二个子句是一个表达式;保留该空作为特例处理,使其等同于true。这是事实这是一个糟糕且不相关的例子。for
标题中的
与OP问题中的
没有任何共同之处。你在
标题中的
根本不是语句。而上面的
for
标题中的
也不是“空语句”.for
中的
只是
for
语法的硬编码字符,没有特殊含义。只有
for
标题的第一部分被称为