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