什么样的循环(;;)?

在torvalds / linux-2.6.git中找到 – > kernel / mutex.c第171行

我试图在谷歌上找到它,但无济于事。

for (;;)指示什么?

for(;;)是一个无限循环条件,类似于while(1),正如大多数人已经提到的那样。 您经常会在内核互斥代码中看到这一点,或者在互联网上看到问题,例如餐饮哲学家。 在将互斥变量设置为特定值之前,第二个进程可以访问资源,第二个进程继续循环,也称为忙等待。 对资源的访问可以是磁盘访问,对于该访问,2个进程正在竞争以使用互斥锁获得访问权,使得一次只有一个进程可以访问该资源。

它的字面意思是“什么都不做,直到什么都没发生,并且在每一步都没有做任何事情来为下一步做好准备”。 基本上,它是一个无限循环,你必须使用breakreturngoto语句以某种方式从内部break

它是一个无限循环,没有初始条件,没有增量条件,没有结束条件。 因此它将永远迭代等同于while(1)。

它永远循环(当然,循环中的代码调用会breakreturnwhile(1)是等价的,我个人觉得使用它更合乎逻辑。

它相当于while( true )

编辑:由于我的回答引起了一些争论(好的辩论,请注意),应该澄清的是,对于未写入C99及更高版本的C程序,这并不完全准确,其中stdbool.h设置了值true = 1。

它是一个无限循环。

它与使用“for”语句编写无限循环相同,但是你必须使用break或其他一些可以退出这个循环的语句。

我的意思是:

 #define EVER ;; for(EVER) { // do something } 

警告:强烈建议不要在代码中使用此代码。

它与while(true) { }function上是等同的。

for(;;)语法有时候首选的原因来自较旧的年龄,其中for(;;)实际编译为稍快的机器代码while(TRUE) {}不是while(TRUE) {} 。 这是因为for(;;) { foo(); } 将在编译器的第一次传递中转换为:

 lbl_while_condition: mov $t1, 1 cmp $t1, 0 jnz _exit_while lbl_block: call _foo jmp lbl_while_condition 

for(;;)将在第一次传递中编译为:

 lbl_for_init: ; do nothing lbl_for_condition: ; always lbl_for_block: call foo; lbl_for_iterate: ; no iterate jmp lbl_for_condition 

  lbl_for_ever: call foo jmp lbl_for_ever 

因此,在循环的每次传递中保存3条指令。

然而,在实践中,这两个语句很久以来不仅在function上等同,而且实际上也是等效的,因为编译器中除了调试构建之外的所有构建的优化将确保在while(1)中优化movcmpjnz case,导致for(;;)while(1)最佳代码。

对于(;;)

是一个无限循环,就像while(1) 。 这里没有给出终止循环的条件。 如果你没有使用break语句打破它,这个循环将永远不会结束。

这是一个无限循环,你必须使用break,return或goto语句从内部以某种方式破坏。 或者发生一些中断,否则这个循环将无限运行并且每次都执行;(n​​ull语句)

这显然是一个无限循环的条件。