代码“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循环的规则,只要conditiontrue语句部分(在您的示例中为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语句。