什么样的循环是(;;)?

时间:2010-01-02 14:05:22

标签: c for-loop kernel mutex

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

我试图在Google上找到它并且无济于事。

for (;;)指示什么?

12 个答案:

答案 0 :(得分:46)

字面意思是“什么都不做,直到什么都没发生,每一步都没有做任何准备下一步”。基本上,这是一个无限循环,你必须使用breakreturngoto语句从内部以某种方式打破。

答案 1 :(得分:20)

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

答案 2 :(得分:9)

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

答案 3 :(得分:5)

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

答案 4 :(得分:4)

相当于while( true )

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

答案 5 :(得分:2)

它是一个无限循环。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

我的意思是:

#define EVER ;;

for(EVER)
{
     // do something
}

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

答案 8 :(得分:1)

  

有(;;)

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

答案 9 :(得分:1)

它在功能上与while(true) { }无关。

有时首选for(;;)语法的原因是for(;;)实际编译为比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条指令。

但实际上,这两个语句早已不仅在功能上等同,而且实际上也是等效的,因为编译器中除调试版本之外的所有构建的优化将确保movcmp jnz情况下优化了while(1),从而为for(;;)while(1)生成了最佳代码。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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