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

use*_*817 26 c while-loop

我们可以像while(condition);C编程一样放分号吗?如果while(condition);有效,这是什么意思?

Cur*_*urd 53

while (condition);
Run Code Online (Sandbox Code Playgroud)

是相同的

while (condition) 
{
}
Run Code Online (Sandbox Code Playgroud)

它可以用于等待循环,例如:

while (!isLightGreen()); // waits until isLightGreen() returns true
go();
Run Code Online (Sandbox Code Playgroud)

  • 应该注意,这将导致执行不断循环并检查条件,因此进程/线程实际上不会等待,而是始终使用CPU时间. (43认同)
  • @Brian也忙着等:) (12认同)
  • @GCATNM:是的,但有时候(例如控制器应用程序等待信号)除了等待之外别无他法.如果这不是期望的行为,则循环体应允许线程/任务切换(例如,使用休眠)或使用其他机制进行等待(例如,回调函数,中断); 但这不是问题...... (5认同)
  • **条件**也可能包括**动作**,毕竟它是一个任意的表达评估.这样**整个**的讨论是荒谬的恕我直言.所有bla-bla回合处理器加载,自旋锁定,阻塞,shmocking等. (3认同)
  • 无论条件是否阻止,注释都是正确的.如果它阻塞,则选择的名称很差,并且循环是不必要的.如果它没有阻止,那么选择的例子很糟糕 - 初学者最常用的是反模式. (3认同)

And*_*mas 27

这意味着循环体是空的.通常,当条件本身执行某些操作时,将使用此模式.

例如,此循环可以复制条件中的字节:

while ( '\0' != (*pt++ = *ps++))
            ;
Run Code Online (Sandbox Code Playgroud)

如果你使用的是分号,最好将它放在一个单独的行上,这样看起来就像是一个错误.我个人倾向于使用空括号 - {},有时候注意空块是故意的.

编辑:

在第二条评论中,汤姆安德森注意到单个分号的改进.Google的C++风格指南建议使用此方法或{}.

while ( '\0' != (*pt++ = *ps++))
            continue;
Run Code Online (Sandbox Code Playgroud)

  • +1表示循环条件有副作用时有用的解释.-100000用于将分号放在单独的行上!可怕!FWIW,comp.lang.java.programmer/comp.lang.c上有一个关于如何设计这个可能感兴趣的结构的好的交叉火焰战. (8认同)
  • `while(condition)continue;`(在继续之前有一个换行符和/或大括号,如你所愿)被建议为一个可读且合理无关的形式. (8认同)
  • 我们可以在逆转条件下再次发生火焰战吗?我非常喜欢'`while((*pt ++ =*ps ++)!='\ 0')`,但这就是火焰战争的美妙之处.(FWIW:我更喜欢下一行的分号.) (5认同)
  • 正如我所提到的,我使用大括号而不是分号.K&R确实在另一条线上使用了分号."继续"模式似乎有所改善.我不认为小东西上的火焰战是有价值的. (2认同)

Bla*_*iev 10

因为这种情况实际上可能有副作用,所以允许这样的构造.考虑以下:

while (*p && *p++ != ' ');
Run Code Online (Sandbox Code Playgroud)

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

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

while (do_something(), do_something_else(), i < n);
Run Code Online (Sandbox Code Playgroud)

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

do {
  do_something();
  do_something_else();
} while (i < n);
Run Code Online (Sandbox Code Playgroud)


Nik*_*chi 10

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

#include<stdio.h>

int x = 10;
int func()
{
  printf("%d\n", x);
  return --x;
}

int main()
{
  while(func());
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但通常人们不会这样做,因为将逻辑放在循环体中会更有意义.

编辑:

有一些使用的示例,例如,复制以null结尾的字符串:

char dest[256];
char *src = "abcdefghijklmnopqrstuvwxyz";
while(*(dest++) = *(src++));
Run Code Online (Sandbox Code Playgroud)


ato*_*ice 5

它将继续评估条件,直到它是错误的.这是一个没有身体的循环.

程序员经常在分号之前添加一个空格,即

while(condition) ;
Run Code Online (Sandbox Code Playgroud)

或空括号:

while(condition) {}
Run Code Online (Sandbox Code Playgroud)

显示空体是有意的,而不仅仅是一个错字.如果你正在阅读一些现有的源代码,并想知道为什么有一个空循环那里你应该阅读接下来的几行,看看分号是否应该真的存在(即接下来的几行看起来像是一个循环与否?).


Dan*_*ite 2

这只是一个空循环。如果您解释一下情况会有所帮助。