【问题标题】:Syntax error with multiple declarations in for loopfor循环中的多个声明的语法错误
【发布时间】:2018-11-25 13:31:00
【问题描述】:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "Rus");

    float arr[25];
    int i;
    double x;
    int a, b, c, e, f;
    double y = a * pow(x, 2) + b * x + c;

    printf("a: ");
    scanf_s("%d", &a);

    printf("b: ");
    scanf_s("%d", &b);

    printf("c: ");
    scanf_s("%d", &c);

    printf("e: ");
    scanf_s("%d", &e);

    printf("f: ");
    scanf_s("%d", &f);

    double interval = (f - e) / 25.0 ;

    for (int i = 0, double x = e; i < 25; i++, x += interval)
    {
        printf("%f", y);
        x++;
    }

    system("pause");
}

我得到 [Error] 预期的标识符或 '(' 在 'double' 之前。我该如何解决它?看起来我真的不需要更改

for (int i = 0, double x = e; i < 25; i++, x += interval)

或者我错了,不知道如何写多个条件。

【问题讨论】:

  • 您是否有意在迭代中使用x++ x += interval?此外,您的迭代可以重写为简单的算术。因为y 不会改变值,您将获得相同的数字 25 次。

标签: c for-loop syntax-error


【解决方案1】:

是的,你不能那样做。

顺便说一句,这些是声明,而不是条件。只有for 循环的中间部分是条件。

您可以在 for 循环的第一部分声明多个变量,但前提是它们具有相同的基类型(例如 int):

for (int x = 1, y = 2, z = 3; ...; ...)

在您的情况下,解决方法是在循环之外声明至少一个变量:

{  // this outer block limits the scope of x
    double x = e;
    for (int i = 0; i < 25; i++, x += interval) 
    {
        printf("%f", y);
        x++;
    }
}

也就是说,您的代码没有任何意义。您的循环不使用x,因此设置它没有意义。另一方面,您打印 25 次的值 (y) 在循环中不会改变。它设置在主函数的顶部,由未初始化的不同 x 变量计算得出。

您应该将y 的声明和初始化移动到循环中并删除外部x。另见https://stackoverflow.com/a/53238897/1848654

【讨论】:

    【解决方案2】:

    你不能用逗号定义多种类型的变量:

    for(int i = 0, double x... 
    

    改为:

    x = e;
    for (int i = 0; i<...
    

    x 已经在上面定义了。

    【讨论】:

      【解决方案3】:

      您可以将它们嵌入到结构中。我不推荐它,因为 IMO 这不是一个好的编码习惯,因为它不容易理解(乍一看)......

      typedef struct {int i; double x;} S;
      for (S yourStruct = {0,e}; yourStruct.i < 25 ; yourStruct.i++, yourStruct.x += interval)
      {
          printf("%f", y);
          yourStruct.x++;
      }
      

      【讨论】:

      • 用“在'for'循环中声明非局部变量”来声明对象。我正在寻找管理它的 C 标准中的东西。
      • 可以在for循环中声明结构对象; clang 不反对for (S yourStruct = {0, e};…),其中S 是之前定义的类型。它只是对象的 for 中的结构类型的声明。
      • @EricPostpischil 如果我错了,请纠正我,但在 for 循环中,应该可以使用 any 声明/定义,也可以在外部使用。因此,如果void f(void) { struct { int x; } s; } 是合法的,则应该能够在 for 循环中执行相同的操作。所以我断定 clang 拒绝它是错误的......
      • @Aconcagua:Clang 总体上还是不错的,但我在 C 标准中没有发现这违反的约束。我发布了this question 看看是否有其他人可以解决它。
      • 这里发生的事情是,Clang 认为在 for 中声明结构类型违反了 C 2018(和 1999 年相同)6.8.5 3:“for 的声明部分声明应仅声明具有存储类 autoregister 的对象的标识符。”由于声明声明了一个类型(C 2018 中的 6.7.2.1 8,C 1999 中的第 7 段:“struct-or-union-specifier 中 struct-declaration-list 的存在声明了一个新类型……”),它是这个for 的声明部分仅声明具有存储类autoregister 的对象的标识符是不正确的。
      【解决方案4】:

      这实际上不是 for 循环的问题:

      void f(void)
      {
          int x, y; // legal - and you can do the same in a for loop's initialization section
          int z, double d; // can't do that either, even outside for loop...
      };
      

      您在单个表达式中声明的所有变量都需要具有相同的(基本!)类型,无论是在 for 循环、函数体还是全局中。 '基本类型':好吧,因为你可以合法地做int x, *p; 之类的事情,xp 属于不同类型,但两种情况下的基本/基础类型都是 int .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-28
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        • 2015-04-17
        • 2021-11-14
        • 2013-01-25
        • 1970-01-01
        相关资源
        最近更新 更多