关于算法:普通C中“while(true)”的正确等价是什么?

What is the proper equivalent of “while(true)” in plain C?

由于c没有bools,在使用

1
2
3
4
do
{
   // ...
} while(true);

????

一个合适的C程序员应该这样做吗?

1
2
3
4
do
{
   // ...
} while(1);

或者是否有一个特定的变量被保留来表示"某个非零/空的东西"?


通常现在我看到

1
2
3
while(1) {
    ...
}

过去经常看到

1
2
3
for(;;) {
    ...
}

这一切都说明了问题所在。


你的问题不是关于bool(现代c确实有,如果你是#include 的话),而是关于编写无限循环的最佳方法。

常见的成语有:

1
2
3
while (1) {
    /* ... */
}

1
2
3
for (;;) {
    /* ... */
}

后者看起来有点模糊,但它定义得很好。for循环头中的三个表达式中的任意一个都可以省略;如果控制循环继续执行的时间的第二个表达式被省略,则默认为true。

while (1)可能是最直接的方法,但有些编译器可能会警告总是正确的条件。for (;;)可能避免了这一点,因为没有(明确)的表达来警告。

写一个无限循环有更复杂的方法(while (1 + 1 == 2)等人,但这些方法都不值得花这么多精力。


如果您使用的是C89:

创建布尔定义:

1
2
3
typedef int bool;
#define true 1
#define false 0

或常量:

1
2
3
/* Boolean constants. */
#define TRUE 1
#define FALSE 0

这给了int一个含义。

如果使用C99:

1
#include <stdbool.h>

我最近在大学的经验是,他们要求你使用C89。

http://en.wikipedia.org/wiki/c_data_types stdbool.h


c有stbool.h头文件使用bool变量。

所以这个作品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include<stdbool.h>
int main(void) {
    int i=1;
    while(true)
    {
        if(i==3){      
        break;
        }
        printf("%d
"
,i);
        i++;
    }
return 0;
}

产量

1
2
1  
2

注:现代C99支持bool变量,但C89/90没有。

如果您使用的是C89/90,那么您可以使用这里其中一个答案中提到的typedefconstants,也可以使用enums以及类似的方法。

1
2
3
4
5
6
7
8
9
10
11
12
   typedef enum {false, true } bool;    
   bool b=true;
   int i=1;
   while(b)
   {
        if(i==3){      
        break;
        }
        printf("%d
"
,i);
        i++;
    }

输出

1
2
1  
2

你可以在C里检查这个胸部

希望对你有帮助。