如何在for(;;)循环在C?

iyzzxitl  于 2023-03-01  发布在  其他
关注(0)|答案(7)|浏览(110)

我认为可以在for循环中声明多个变量:

for (int i = 0, char* ptr = bam; i < 10; i++) { ... }

但我刚刚发现这是不可能的。GCC给出了以下错误:
错误:“char”前应为未限定的ID
不能在for循环中声明不同类型的变量,这是真的吗?

yuvru6vn

yuvru6vn1#

您可以(但通常不应该)使用局部结构类型。

for ( struct { int i; char* ptr; } loopy = { 0, bam };
      loopy.i < 10 && * loopy.ptr != 0;
      ++ loopy.i, ++ loopy.ptr )
    { ... }

从C++11开始,你可以更优雅地初始化各个部分,只要它们不依赖于局部变量:

for ( struct { int i = 0; std::string status; } loop;
      loop.status != "done"; ++ loop.i )
    { ... }

这几乎是可读性足够真正使用。
C++17解决了 structured bindings 的问题:

using namespace std::literals::string_literals;

for ( auto [ i, status ] = std::tuple{ 0, ""s }; status != "done"; ++ i )
mtb9vblg

mtb9vblg2#

的确,你不能同时声明和初始化不同类型的声明器,但这并不是for循环所特有的,如果你这样做,你会得到一个错误:

int i = 0, char *ptr = bam;

for循环的第一个子句可以是(C99 §6.8.5.3)“一个声明”或“一个空表达式”。注意你可以:

int i = 0, *j = NULL;
for(int i = 0, *j = NULL;;){}

因为i*j都是int类型,6.7节给出了声明的确切语法

3wabscal

3wabscal3#

如果你真的需要变量留在循环的作用域中,你可以写

{ char* ptr = bam; for (int i = 0; i < 10; i++) { ... } }

有点难看,但很管用。

plupiseo

plupiseo4#

试试这个:

int i;
char* ptr;
for (i = 0, ptr = bam; i < 10; i++) { ... }
eagi6jfj

eagi6jfj5#

您还可以执行以下操作:

for (int i = 0; i < 10; i++) {
    static char* ptr = bam;
}
eyh26e7m

eyh26e7m6#

根据http://linuxsoftware.co.nz/cppgrammar.html#for-init-statement,在for-init语句中只能得到简单的声明或表达式(不允许包含声明)。这意味着答案是否定的(如果我正确分析了BNF:)

y53ybaqx

y53ybaqx7#

我认为现在他们教你们这些孩子的语言是为了给你们戴上手铐,腐 eclipse 你们的大脑,所以你们只能安静地把乐高积木放在一起,以非常有限的形式,它们应该卡在一起,这样你们就可以建造平庸的东西。C语言的美妙之处在于你可以遵循规则,而且是以一种聪明的方式,来得到你想要的。下面是你如何用额外的初始化器来编写这个循环。下面是一个工作示例,它向你展示了如何将一个扩展循环桥接到第一个循环上。你使用第一个循环来盗用它的变量,它们仍然在作用域中。你使用一个伪变量来使外部循环运行一次。聪明的编译器会注意到这个事实,并使用循环展开器来核武器循环。所以对你来说这只是好处。第二个数组然后使用第一个声明和第二个声明中的一些变量,并运行到完成。这是一个很普通的例子,只是为了让你能够理解如何去做,而不需要在一些作用域中进行繁重的操作。因为这种技术可以和宏一起使用,当这样编写时,可以创建漂亮的下一代,比如结构枚举,比如“for value in array do”,我有很多这样的例子。

#include "stdio.h"
int
main(int argc, char **argv)
{
    const int max=7;
    const char *array[7] = {
    "hello","you","kids","who","don't","know","malloc\n"
    };

    for(int i=0,count=max,$=1;$;$=0)
    for(const char **p=array;count<max;i++)
    {
        printf("%s ",p[i]);
    }
}

这里什么都没有遗漏,这种for循环和一次循环连接的技术已经被用来嵌入一个调用来获取这个哈希对象的枚举数,并开始枚举,来获取为键和值提取的值,也为了方便用户创建它们作为空指针,他只需要给它们命名,然后它们就被填充了,枚举会一直进行,直到所有的键和值都被枚举完,如果用户中断了迭代,那么一次触发循环的整个级联就会崩溃,因为它们可能根本就不存在,因为它们是用简单的常量操作构造的,编译器可以看到这些操作会展开循环。基本上,它允许您扩展语法来做类似这样的事情,而不会有任何损失。
但是你需要懂一点C语言,至少要把你的头从机器人盒子里拿出来,这些天学校把它们放在这些玩具语言里。

相关问题