For循环表示在循环中初始化整数时表达式语法错误

时间:2010-08-27 20:51:10

标签: c

编程时我遇到了一个不寻常的错误。当我在循环中初始化一个整数时,有时它表示该表达式无效,但有时它接受它。 这是我的代码,它给出了错误:

int pow(int x,int n);
int main()
{
    int x,n,result;
    printf("Enter a number:\n");
    scanf("%d",&x);
    printf("Enter its power:\n");
    scanf("%d",&n);
    result=pow(x,n);
    printf("Result is %d\n",result);
    getch();
    return 0;
}
int pow(int x,int n)
{   
    for(int i=1;i<n;i++)   //<-- here it says that declaration syntax error
    x=x*i;
    return x;
}

当我改变它时:

int pow(int x,int n)
{   
    int i;
    for(i=1;i<n;i++)  
    x=x*i;
    return x;
}

4 个答案:

答案 0 :(得分:11)

C89和早期版本仅支持块头部的声明语句(IOW,开头{和声明之间唯一可能出现的是另一个声明):

/* C89 and earlier */
int main(void)
{
  int x;                      /* this is legal */
  ...
  for (x = 0; x < 10; x++)
  {
    int i;                    /* so is this */
    printf("x = %d\n", x);
    int j = 2*x;              /* ILLEGAL */
  }
  int y;                      /* ILLEGAL */
  ...
}

使用C99,声明语句几乎可以出现在任何地方,包括控制表达式(注意必须在使用之前声明某些内容):

// C99 and later, C++
int main(void)
{
  int x;                       // same as before
  ...
  for (int i = 0; i < 10; i++) // supported as of C99
  {
    printf("i = %d\n", i);
    int j = 2 * i;             // supported as of C99
  }
  int y;                       // supported as of C99
}

Turbo C早于C99标准,因此如果您想编写第二个示例中的代码,则需要使用更新的编译器。

答案 1 :(得分:9)

在C中,在C99之前,您需要在循环之前声明变量。在C ++中,现在在C99中,您可以在此处尝试在循环内声明它们。您获得的不同结果可能是因为您有时编译为C ++,有时编译为C。

您可以尝试确保始终将代码编译为C ++,或者如果您正在使用GCC或Clang,请使用--std=c99标志进行编译。 MSVC不支持C99,因此如果您使用的是MSVC,则需要使用C ++或在循环外部移动声明。

答案 2 :(得分:5)

听起来你有一个C89编译器(而不是C99编译器)。

在C89中,只允许在函数开头声明变量。您根本不允许在函数的其他地方声明变量,包括在for语句的初始化部分。这就是为什么第二种语法有效,第一种语法失败。

第二种语法对C99和C ++有效,但对C89则无效。

答案 3 :(得分:2)

您使用的是什么C编译器?

C99之前的旧版本C要求所有变量声明都在代码块的顶部进行。