首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在for循环中有错误

我在for循环中有错误
EN

Stack Overflow用户
提问于 2020-05-23 18:34:27
回答 4查看 108关注 0票数 1

我的for循环中出现了错误,我想知道为什么:

代码语言:javascript
复制
for (int i = 0; char a = 'a'; i < n; i++; a++)

substitution.c:24:25: error: expected expression
        for (int i = 0; char a = 'a'; i < n; i++; a++)
                        ^
substitution.c:24:44: error: expected ')'
        for (int i = 0; char a = 'a'; i < n; i++; a++)
                                           ^
substitution.c:24:13: note: to match this '('
        for (int i = 0; char a = 'a'; i < n; i++; a++)
            ^
substitution.c:24:46: error: use of undeclared identifier 'i'
        for (int i = 0; char a = 'a'; i < n; i++; a++)
                                             ^
substitution.c:24:51: error: use of undeclared identifier 'a'
        for (int i = 0; char a = 'a'; i < n; i++; a++)

编辑:

代码语言:javascript
复制
when i use for (int i = 0, char a = 'a'; i < n; i++, a++)
i get:
substitution.c:24:25: error: expected identifier or '('
        for (int i = 0, char a = 'a'; i < n; i++, a++)
                        ^
substitution.c:24:25: error: expected ';' in 'for' statement specifier
substitution.c:24:25: error: expected expression
substitution.c:24:44: error: expected ')'
        for (int i = 0, char a = 'a'; i < n; i++, a++)
                                           ^
substitution.c:24:13: note: to match this '('
        for (int i = 0, char a = 'a'; i < n; i++, a++)
            ^
substitution.c:24:46: error: use of undeclared identifier 'i'
        for (int i = 0, char a = 'a'; i < n; i++, a++)
                                             ^
substitution.c:24:51: error: use of undeclared identifier 'a'
        for (int i = 0, char a = 'a'; i < n; i++, a++)
                                                  ^
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-23 19:26:07

来自C11 Standards#6.8.5.3 ( for语句)

1语句

代码语言:javascript
复制
      for ( clause-1 ; expression-2 ; expression-3 ) statement

的行为如下:表达式-2是在循环体每次执行之前计算的控制表达式。表达式表达式-3在循环体每次执行后被计算为一个空表达式。如果子句-1是一个声明,则它声明的任何标识符的范围是声明的其余部分和整个循环,包括其他两个表达式;它是在对控制表达式进行第一次计算之前按执行顺序到达的。如果子句-1是表达式,则在对控制表达式进行第一次计算之前,将其计算为一个空表达式。

脚注

因此,子句-1指定循环的初始化,可能声明一个或多个变量在循环中使用;控制表达式-2指定在每次迭代之前进行的计算,以便循环的执行一直持续到表达式比较等于0;表达式-3指定在每次迭代之后执行的操作(例如递增)。

也来自C11 Standards#6.7 (声明)

declaration: declaration-specifiers init-declarator-listopt ;

注意声明末尾的;

clause-1可以是声明语句或表达式。如果clause-1是一个声明,则可以声明一个或多个相同类型的变量,因为声明以;结尾。所以,你可以-

代码语言:javascript
复制
for (int i = 0, j = 0; expression-2 ; expression-3 ) statement

expression-2expression-3是表达式,可以使用任何有效的表达式来代替它们。

如果在for循环中使用不同类型的多个变量,则可以在clause-1中初始化它们,条件是它们应该在循环之前声明:

代码语言:javascript
复制
char a;
int i;
for (i = 0, a = 'a'; i < n; i++, a++)

当然,你也可以

代码语言:javascript
复制
char a = 'a';
int i = 0;
for (; i < n; i++, a++)
票数 2
EN

Stack Overflow用户

发布于 2020-05-23 18:41:27

for循环的第一部分中,只能有一个声明子句(声明一个或多个类型的变量)。这些变量中至少有一个必须在循环之外声明。

代码语言:javascript
复制
char a = 'a';
for (int i = 0; i < n; i++; a++)
票数 1
EN

Stack Overflow用户

发布于 2020-05-23 19:03:02

形式上,for循环如下所示:

代码语言:javascript
复制
for (expression; expression; expression) statement

代码语言:javascript
复制
for (declaration; expression; expression) statement

通常,它是这样使用的:

代码语言:javascript
复制
for(init; condition; increment) statement

您可以在init中声明多个变量,但它们必须是相同类型的。解决办法是声明一个结构。这里有一个概念的证明:

代码语言:javascript
复制
$ cat k.c 
#include <stdio.h>

int main()
{
    for(struct {
        int a; char b; double c; } s =
        { .a = 0, .b = 'a', .c = 1.3 };
        s.a < 10;
        s.a++
        )
    {
        s.b+=2;
        s.c+=3;
        printf("%d %c %f\n", s.a, s.b, s.c);
    }
}

$ gcc k.c -Wall -Wextra -std=c11 -pedantic

$ ./a.out 
0 c 4.300000
1 e 7.300000
2 g 10.300000
3 i 13.300000
4 k 16.300000
5 m 19.300000
6 o 22.300000
7 q 25.300000
8 s 28.300000
9 u 31.300000

IMHO,上面的是过份的和不太可读的。如果您非常希望其他变量在for循环中是本地变量,则可以将其封装在括号中以创建如下范围:

代码语言:javascript
复制
{ // Starting bracket
  // Declare variables
for(;;) {
}} // End both for loop and previous scope

示例:

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    {   char b = 'a'; 
        double c = 1.3;
    for(int a=0; a<10; a++)
    {
        b+=2;
        c+=3;
        printf("%d %c %f\n", a, b, c);
    }}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61976852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档