什么样的循环(;;)?
在torvalds / linux-2.6.git中找到 – > kernel / mutex.c第171行
我试图在谷歌上找到它,但无济于事。
for (;;)
指示什么?
for(;;)是一个无限循环条件,类似于while(1),正如大多数人已经提到的那样。 您经常会在内核互斥代码中看到这一点,或者在互联网上看到问题,例如餐饮哲学家。 在将互斥变量设置为特定值之前,第二个进程可以访问资源,第二个进程继续循环,也称为忙等待。 对资源的访问可以是磁盘访问,对于该访问,2个进程正在竞争以使用互斥锁获得访问权,使得一次只有一个进程可以访问该资源。
它的字面意思是“什么都不做,直到什么都没发生,并且在每一步都没有做任何事情来为下一步做好准备”。 基本上,它是一个无限循环,你必须使用break
, return
或goto
语句以某种方式从内部break
。
它是一个无限循环,没有初始条件,没有增量条件,没有结束条件。 因此它将永远迭代等同于while(1)。
它永远循环(当然,循环中的代码调用会break
或return
。 while(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)
中优化mov
, cmp
和jnz
case,导致for(;;)
和while(1)
最佳代码。
对于(;;)
是一个无限循环,就像while(1)
。 这里没有给出终止循环的条件。 如果你没有使用break
语句打破它,这个循环将永远不会结束。
这是一个无限循环,你必须使用break,return或goto语句从内部以某种方式破坏。 或者发生一些中断,否则这个循环将无限运行并且每次都执行;(null语句)
这显然是一个无限循环的条件。