繁体   English   中英

代码“while(condition);”是否有效,是什么意思?

[英]Is the code “while(condition);” valid and what does it mean?

我们可以像分钟一样放(分号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 (*p && *p++ != ' ');

这会将p指针前进到作为空格的第一个字符。

您甚至可以使用逗号运算符在条件中包含普通语句:

while (do_something(), do_something_else(), i < n);

因为与逗号运算符连接的语句计算到最右边的语句,在这种情况下i < n ,以上内容与以下内容相同:

do {
  do_something();
  do_something_else();
} while (i < n);

是的你可以。 它只是意味着while循环将保持循环,直到condition为假。 例如:

#include<stdio.h>

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(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循环的规则,只要条件语句部分(在您的示例中为null语句)将执行(不执行任何操作)。 这很有用,因为它等于忙碌等待,直到条件变为 不是一个好的方式等待,但仍然有用。 例如,如果要在继续前进之前等待另一个线程(或信号处理程序)将变量设置为某个值,则可以使用此构造。

代码while(condition); 是完全有效的代码,虽然它的用途很少。 我认为condition是变量,而不是函数 - 其他人在这里讨论函数condition

while(condition);一种用法while(condition); 可能是在等待信号时阻塞,例如SIGHUP ,其中信号处理程序改变可变condition 但是,这通常不是等待信号的最佳方式。 人们通常会在循环中使用sleep ,即while(condition) { sleep(1); } while(condition) { sleep(1); }

没有任何sleep意味着循环将在过渡期间持续处理,并且可能浪费处理周期。 除非进程有资源管理(甚至那里......),我认为这只适用于需要在小于可用sleep命令的粒度的间隔中打破循环的情况(即睡眠被第二个粒度化,但是你需要使用亚秒响应时间执行外观后的代码。 话虽这么说,一个阻塞管道或插座可能比信号更好,性能明智 - 虽然我没有任何经过验证的数据来支持这种情况,我怀疑性能可能会因平台而有很大差异。

可以通过相同进程的并行线程修改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语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM