我们可以在C编程中加上像while(condition);
这样的分号吗?
如果while(condition);
有效,那是什么意思?
答案 0 :(得分:52)
while (condition);
与
相同while (condition)
{
}
它可以用于等待循环,例如:
while (!isLightGreen()); // waits until isLightGreen() returns true
go();
答案 1 :(得分:27)
这意味着循环体是空的。通常,当条件本身执行某些操作时,将使用此模式。
例如,此循环可以在条件中复制字节:
while ( '\0' != (*pt++ = *ps++))
;
如果你使用分号,最好将它放在一个单独的行上,这样看起来就像是一个错误。我个人倾向于使用空括号 - {},有时候注意空块是故意的。
修改强>
在第二条评论中,汤姆安德森注意到一个单独分号的改进。 Google's C++ style guide建议使用此或{}。
while ( '\0' != (*pt++ = *ps++))
continue;
答案 2 :(得分:10)
因为这种情况实际上可能有副作用,所以允许使用这种结构。请考虑以下事项:
while (*p && *p++ != ' ');
这将使p
指针前进到第一个空格字符。
您甚至可以使用逗号运算符在条件中包含普通语句:
while (do_something(), do_something_else(), i < n);
因为与逗号运算符连接的语句评估到最右边的语句,在这种情况下i < n
,上面的内容与:
do {
do_something();
do_something_else();
} while (i < n);
答案 3 :(得分:10)
是的,你可以。它只是意味着while循环将保持循环,直到condition
为假。例如:
#include<stdio.h>
int x = 10;
int func()
{
printf("%d\n", x);
return --x;
}
int main()
{
while(func());
return 0;
}
但通常人们不会这样做,因为将逻辑放在循环体中会更有意义。
编辑:
有一些例子正在使用中,例如,复制以空字符结尾的字符串:
char dest[256];
char *src = "abcdefghijklmnopqrstuvwxyz";
while(*(dest++) = *(src++));
答案 4 :(得分:5)
它将继续评估条件,直到它为假。这是一个没有身体的循环。
程序员经常在分号前添加一个空格,即
while(condition) ;
或空括号:
while(condition) {}
显示空体是故意的,而不仅仅是一个错字。如果你正在阅读一些现有的源代码,并想知道为什么有一个空循环那里你应该阅读接下来的几行,看看分号是否应该真的存在(即接下来的几行看起来像是一个循环与否?)。
答案 5 :(得分:4)
是的,这是对的。它将循环该条件,直到它为假。
while ( condition() );
答案 6 :(得分:4)
我总是把它写成:
while (condition())
continue;
因此很明显,这不是一个错误。正如其他人所说,只有当条件()有副作用时才有意义。
答案 7 :(得分:3)
while()是一个循环。你可能想要做一个“do-while”循环。 Do-while循环以这种格式运行:
do
{
// Your process
// When something goes wrong or you wish to terminate the loop, set condition to 0 or false
} while(condition);
然而,您在上面列出的那个是一个空循环。
while()循环工作几乎相同;根本没有“做”部分。
祝你好运!答案 8 :(得分:3)
这意味着继续检查条件,直到评估为 false
答案 9 :(得分:3)
理解这一点的关键是“C”中 while循环的语法如下:
while (condition) statement
其中语句可以是任何有效的“C”语句。以下是所有有效的“C”语句:
{ statements } // a block statement that can group other statements
statement; // a single statement terminated by a ;
; // a null statement terminated by a ;
因此,根据 while循环的规则,语句部分(在您的示例中为null语句)将执行(不执行任何操作),只要条件是 true 。这很有用,因为它等于忙等待,直到条件变为 false 。不是一个好的方式等待,但仍然有用。例如,如果要等待另一个线程(或信号处理程序)将变量设置为某个值,然后继续前进,则可以使用此构造。
答案 10 :(得分:3)
代码while(condition);
是完全有效的代码,尽管它的用途很少。我认为condition
是一个变量,而不是一个函数 - 其他人在这里讨论函数condition
。
while(condition);
的一次使用可能是在等待signal时阻止,例如SIGHUP
,信号处理程序更改变量condition
。但是,这通常不是等待信号的最佳方式。通常会在循环中使用sleep
,即while(condition) { sleep(1); }
。
缺少任何sleep
意味着循环将在过渡期间不断处理,并且可能浪费处理周期。除非进程管理其资源(甚至那里......),否则我认为这只适用于需要在小于可用sleep
命令的粒度的时间间隔内打破循环的情况(即睡眠被粒化)到第二个,但你需要在看起来执行亚秒响应时间后的代码)。话虽这么说,一个阻塞的管道或插座可能比信号更好,性能明智 - 虽然我没有任何经过验证的数据来支持这种情况,我怀疑性能可能因平台而有很大差异。
一个可以通过相同进程的并行线程修改condition
,但我认为应该更喜欢通过互斥或信号量(即{{ 1}}可能需要不仅仅是一个简单的变量。)
我希望这有用,或至少值得深思!
答案 11 :(得分:2)
这只是一个空循环。如果你解释了条件是什么会有所帮助。
答案 12 :(得分:1)
如果条件的评估没有修改影响条件本身的值,while(condition);
是一个空的无限循环,这意味着它永远不会终止(除了消耗CPU时间之外什么也不做)。
答案 13 :(得分:1)
绝对正确。它意味着在循环中什么也不做,只是轮询条件。它在嵌入式系统代码中很常见。
答案 14 :(得分:1)
它只是一个没有执行主体的while循环
while(condition);
与
相同while(condition)
{
}
答案 15 :(得分:-1)
这里没有描述的另一种用法:
do
{
if(out_of_memory)
break;
if(file_does_not_exist)
break;
return ok;
} while(0);
return error;
这允许您避免多次返回调用或goto语句。