while 循环与 C 中的变量定义

while loop with variable definition in C

我目前正在尝试遍历由 API 在 C 中检索到的集合。

API 提供了一个函数 getNext() returns 对集合中下一个元素的引用,如果已经到达末尾则为 NULL。

现在我想在 while 表达式中声明一个变量并循环直到 NULL:

// create collection from API
Collection collection = create();

if (collection == NULL) {
  return -1
}

while (const Element *e = getNext(collection) != NULL) {
  // print data from e
}

编译时,弹出'error: unexpected expression'。为什么该语句在 C 中不起作用?当我只有一个 returns 元素或 NULL 的函数 getNext() 时,如何遍历集合?

我也试了下面的,还是出现同样的错误:

while ((const Element *e = getNext(collection)) != NULL) {
  // print data from e
}

在 C 中,不能在 while 循环的条件表达式中声明变量。

GCC 会告诉你:

Error: Expected expression before 'const'

这是不可能的,因为 while() 需要一个表达式,并且不可能在表达式中放置一个声明(尽管可以用表达式引入一个新类型!)。

你能得到的最好的是:

const Element *e;
while ((e = getNext(collection)) != NULL) {
  // print data from e
}

然而,可以通过 for 循环实现所需的功能。

for (const Element *e; (e = getNext(collection)) != NULL; ) {
  // print data from e
}

首先,对比一个for statement, you cannot declare a new variable in a while语句。因此,下面一行是错误的:

while (const Element *e = getNext(collection) != NULL) {

您可以通过编写以下内容来解决此问题:

const Element *e;

while ( e = getNext(collection) != NULL ) {

更简洁的写法如下:

for ( const Element *e; e = getNext(collection) != NULL ; ) {

第二个版本的优点是变量escope被限制在for循环中。

但是,上面提到的那几行也是错误的,原因如下:

!= 运算符比 =higher precedence。所以行

while ( e = getNext(collection) != NULL) {

相当于:

while ( e = ( getNext(collection) != NULL ) ) {

这不是你想要的。您应该改写以下内容:

while ( ( e = getNext(collection) ) != NULL ) {

我会写这样的东西,希望对你有帮助:)

void main()
{
    bool running = true;
    while(running)
    {
        printf("Running while loop\n");
        running = getNext() != NULL; //Check if there is data in your collection - otherwise exit
    }
    printf("getNext() returned NULL\n");
    return;
}

C 编程中的一些经验法则是:“不要做非常奇怪的事情”和“永远不要在控制或循环语句中进行赋值”。事实证明,我们可以遵循这些规则并使用 for 循环解决所有问题:

for(const Element* e = getNext(collection); e != NULL; e = getNext(collection))