如何在C中的for(;;)循环中初始化几个变量?

bod*_*ydo 31 c loops for-loop initialization

我以为可以在for循环中初始化几个变量:

for (int i = 0, char* ptr = bam; i < 10; i++) { ... }
Run Code Online (Sandbox Code Playgroud)

但我发现这是不可能的.GCC给出以下错误:

错误:'char'之前的预期unqualified-id

你是否真的无法在for循环中初始化不同类型的变量?

Pot*_*ter 46

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

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

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

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

这几乎可读得足以真正使用.


C++ 17计划用于解决结构化绑定的问题:

for ( auto [ i, status ] = { 0, ""s }; status != "done"; ++ i )
Run Code Online (Sandbox Code Playgroud)

但是,详细的功能集和语法仍在不断变化.

  • 哇; 我以前从未见过这个.如果我曾经使用它,我相信队友会杀了我,但我很受诱惑 (19认同)
  • 丑陋地狱,但有效. (13认同)
  • 当人们说"只是因为你*可以*做到并不意味着你应该*"时,他们就是在谈论这样的事情.但它确实有效. (8认同)
  • 这太丑了我真的想把它投下来,但我不能因为它有效.上帝知道为什么有人投票**.我必须找出他们中的任何一个是否适用于我的公司,并确保他们被解雇. (3认同)
  • 问题是关于C的。C++的答案是题外话。 (3认同)
  • @Potatoswatter:它有一定的风格,有点像钓鱼鱼.他们真的很难看,但人们对他们很着迷. (2认同)
  • 我仍然尝试了解C ++在这里到底在做什么。 (2认同)

Mat*_*hen 18

确实,您无法同时声明和初始化不同类型的声明符.但这并不是特定于for循环.如果您这样做,您将收到错误:

int i = 0, char *ptr = bam;
Run Code Online (Sandbox Code Playgroud)

太.for循环的第一个子句可以是(C99§6.8.5.3)"声明"或"void表达式".请注意,您可以这样做:

int i = 0, *j = NULL;
for(int i = 0, *j = NULL;;){}
Run Code Online (Sandbox Code Playgroud)

因为i并且*j都是类型int.声明的确切语法在§6.7中给出


Axe*_*ing 13

如果你真的需要变量保留在你可以编写的循环范围内

{ char* ptr = bam; for (int i = 0; i < 10; i++) { ... } }
Run Code Online (Sandbox Code Playgroud)

这有点难看,但有效.

  • 这是最好的答案...不幸的是,在编写一个扩展为`for(...)`的宏时它不起作用(因此宏的用户为它们添加了自己的花括号). (5认同)

Gar*_*ary 7

试试这个:

int i;
char* ptr;
for (i = 0, ptr = bam; i < 10; i++) { ... }
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

43402 次

最近记录:

6 年,12 月 前