编程时我遇到了一个不寻常的错误。当我在循环中初始化一个整数时,有时它表示该表达式无效,但有时它接受它。 这是我的代码,它给出了错误:
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;
}
答案 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要求所有变量声明都在代码块的顶部进行。