代码是“while(条件);”有效,这是什么意思?

时间:2010-11-08 15:16:26

标签: c while-loop

我们可以在C编程中加上像while(condition);这样的分号吗? 如果while(condition);有效,那是什么意思?

16 个答案:

答案 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语句。