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 ; ) {
第二个版本的优点是变量e
的scope被限制在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))
我目前正在尝试遍历由 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 ; ) {
第二个版本的优点是变量e
的scope被限制在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))