为什么这个for循环不正确?

时间:2016-08-29 11:51:14

标签: c++ for-loop

Visual Studio告诉我这个for循环是不正确的。 错误消息是:

  
      
  • 键入bool unexpected
  •   
  • ok是未声明的标识符
  •   
  • 失踪;之前}
  •   

的相关信息:

  

-recordset.Select返回一个long -MoveNext一个bool

for (size_t i = 0, bool ok = recordset.Select(Adress::getSQLStatement() + "Where A05.recid = %ld", i); ok; ok = recordset.MoveNext(), i++) {
    at(i).Save(recordset);
}

2 个答案:

答案 0 :(得分:6)

正如 StenSoft 所说。但是你可以在循环第一个语句中定义一个匿名结构,并初始化它。

#include <iostream>
using namespace std;

int main() {
    for (struct {size_t i; bool ok;} s = {0, true}; s.ok; ++s.i) {
        s.ok = s.i < 10;
        cout << s.i;
    }
    return 0;
}

但是恕我直言,while it works,它比它的价值更麻烦。更好地重组您的代码。

答案 1 :(得分:2)

首先,您当然可以像这样重写循环:

{
    bool ok = recordset.Select(...);
    for (std::size_t i = 0; ok; ok = recordset.MoveNext(), ++i)
    {
        /* ... */
    }
}

但这里的元课是几乎所有循环都是for - 循环,当你认为你的结构不同时,再想一想。可能会在for - 循环方面进行重写,使您的逻辑更清晰。您目前的代码并没有将初始错误与&#34;没有更多记录区分开来。错误以后。使用新代码,现在明确可能:

if (bool ok = recordset.select(...)) 
{
    for (std::size_t i = 0; ok; ok = recordset.MoveNext(), ++i) { /* ... */ }
}
else
{
    // handle initial error
}

我甚至可能摆脱多余的ok变量:

if (recordset.select(...)) 
{
    for (std::size_t i = 0; ; ++i)
    {
        /* ... */

        if (!recordset.MoveNext()) break;
    }
}
else
{
    // handle initial error
}