Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中的for(;;)循环中声明几个变量?_C_Loops_For Loop_Declaration - Fatal编程技术网

如何在C中的for(;;)循环中声明几个变量?

如何在C中的for(;;)循环中声明几个变量?,c,loops,for-loop,declaration,C,Loops,For Loop,Declaration,我认为可以在for循环中声明几个变量: for (int i = 0, char* ptr = bam; i < 10; i++) { ... } for(inti=0,char*ptr=bam;i

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

for (int i = 0, char* ptr = bam; i < 10; i++) { ... }
for(inti=0,char*ptr=bam;i<10;i++){…}
但我刚刚发现这是不可能的。GCC给出了以下错误:

错误:“char”之前应为非限定id

您真的不能在
for
循环中声明不同类型的变量吗?

尝试以下方法:

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

确实,不能同时声明和初始化不同类型的声明器。但这并不特定于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
类型。根据for init语句中只能得到简单声明或表达式(不允许包含声明),声明的确切语法在§6.7中给出。这意味着答案是否定的(如果我正确分析了BNF:)

如果您确实需要变量保持在您可以编写的循环范围内

{ char* ptr = bam; for (int i = 0; i < 10; i++) { ... } }
{char*ptr=bam;for(inti=0;i<10;i++){…}
这有点难看,但很有效。

您可以(但通常不应该)使用本地结构类型

for ( struct { int i; char* ptr; } loopy = { 0, bam };
      loopy.i < 10 && * loopy.ptr != 0;
      ++ loopy.i, ++ loopy.ptr )
    { ... }
这几乎是可读性足以真正使用


C++17解决了以下问题:


我认为这些天他们教给孩子们的语言是为了铐住你,腐蚀你的大脑,所以你只需要保持安静,把乐高积木以非常有限的形式组合在一起,它们是为了拼合在一起,这样你就能制造出平庸的东西。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]);
    }
}
#包括“stdio.h”
int
主(内部argc,字符**argv)
{
常数int max=7;
常量字符*数组[7]={
“你好”、“你”、“孩子”、“谁”、“不”、“知道”、“马洛克”\n
};
对于(int i=0,count=max,$=1;$;$=0)
对于(const char**p=array;count,您还可以执行以下操作:

for (int i = 0; i < 10; i++) {
    static char* ptr = bam;
}
for(int i=0;i<10;i++){
静态字符*ptr=bam;
}

我知道在某处有一个非常密切相关的问题,但我找不到它…@msw我真的不认为
for(int I=0,char*ptr=bam)
int I;char*ptr;for(I=0,ptr=bam)更难读
同意,像
ptr
bam
这样的名字很难让它变得更少readable@msw…这很可能是为了提问的目的而简化的可能是丑陋的地狱的复制品,但很有效。哇;我以前从未见过。我相信如果我用过它,队友会杀了我,但我很受诱惑+1:非常折衷。我不会这么做,但它很好地揭示了潜在的语言语义。当人们说,“仅仅因为你能做到这一点并不意味着你应该做到”,他们在谈论这样的东西。不过它很管用。@Potatosatter:它有某种风格,有点像垂钓者鱼。它们真的很难看,但人们都被它们迷住了。这是最好的答案……不幸的是,在编写扩展到(…)的
宏时,它不管用。
(因此,宏的用户为主体添加了他们自己的花括号)。有趣的是,您的示例不起作用——假设您希望它实际打印任何内容。事实上,您甚至没有完全回答这个问题:如果您必须初始化3个不同类型的变量,您是否会使用2个“一次一次”阿克塞尔·格尼廷的答案简单得多,解决了所有问题。Link dead,你应该发布这个重要的片段。不管怎样,你是否从“CPPGramarm”分析了BNF…一个C问题?
#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 (int i = 0; i < 10; i++) {
    static char* ptr = bam;
}