在torvalds / linux-2.6.git中找到 - > kernel / mutex.c第171行
我试图在Google上找到它并且无济于事。
for (;;)
指示什么?
答案 0 :(得分:46)
字面意思是“什么都不做,直到什么都没发生,每一步都没有做任何准备下一步”。基本上,这是一个无限循环,你必须使用break
,return
或goto
语句从内部以某种方式打破。
答案 1 :(得分:20)
for(;;)是一个无限循环条件,类似于while(1),正如大多数人已经提到的那样。你经常会在内核互斥代码中看到这个,或者像互联网哲学家那样的问题。在将互斥变量设置为特定值之前,第二个进程可以访问资源,第二个进程继续循环,也称为忙等待。对资源的访问可以是磁盘访问,对于该访问,2个进程正在竞争以使用互斥锁获得访问权,使得一次只有一个进程可以访问资源。
答案 2 :(得分:9)
这是一个无限循环,没有初始条件,没有增量条件,没有结束条件。所以它将永远迭代等同于while(1)。
答案 3 :(得分:5)
它永远循环(当然循环中的代码调用break
或return
当然。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条指令。
但实际上,这两个语句早已不仅在功能上等同,而且实际上也是等效的,因为编译器中除调试版本之外的所有构建的优化将确保mov
,cmp
jnz
情况下优化了while(1)
,从而为for(;;)
和while(1)
生成了最佳代码。
答案 10 :(得分:0)
这显然是一个无限循环条件。
答案 11 :(得分:0)
这是一个无限循环,你必须使用break,return或goto语句以某种方式从内部中断。 或者发生一些中断,否则这个循环将无限运行并且每次都执行;(null语句)