2016-04-23 71 views
0

我有下面的代码片段:Ç - 设置一个静态变量的值,如果取消设置

#include<stdio.h> 
void read(int a[ ],int n) 
{ 
     static int p=n; 
     if(n!=0) 
     { 
      printf("enter element %d: ",p-n); 
      scanf("%d",&a[p-n]); 
      read(a,n-1); 
     } 
} 
int main() 
{ 
    int a[10],n; 
    printf("enter n: "); 
    scanf("%d",&n); 
    read(a,n); 
} 

我不断收到error: initializer element is not constant。 函数编译时不是n常量吗?

编辑: 问题:如何在函数中设置静态变量的值(如果没有设置)?

+3

这是因为你不能用另一个变量初始化一个静态变量,只有在编译时才能确定的常量值。 – ddz

+2

答案是否定的。它不是常量,是一个变量,传递给一个函数。在C中,通过使用'#define n 10'可以使编译时间保持不变。此外,这个参数有几个帖子,请参阅http://stackoverflow.com/questions/3025050/error-initializer-element-is-not-constant-when-trying-to-initialize-variable-w –

+1

' static int p = n;' - >'static int p;如果(!p)p = n;' – BLUEPIXY

回答

2

绝对不是;编译器如何知道在编译时哪些值将被分配给n?

1

编辑:解决办法是分配给pn如果p未设置

解决方案:

#include<stdio.h> 
static int p; 
void read(int a[ ],int n) 
{ 
    //p=n; //to change n on each call 
    if(!p) p = n; //to change n only if p is unset 
     if(n!=0) 
     { 
      printf("enter element %d: ",p-n); 
      scanf("%d",&a[p-n]); 
      read(a,n-1); 
     } 
} 
int main() 
{ 
    int a[10],n; 
    printf("enter n: "); 
    scanf("%d",&n); 
    read(a,n); 
} 
+0

感谢您的帮助,但那不是我所需要的,因为p每次都需要一个新的n。 – user6019827

+0

究竟是什么问题?你不想让每个循环获得n值吗? –

+0

不,我希望它只取第一个n,所以p-n用作数组的索引。 – user6019827

4

这是因为你不能与其他可变初始化一个static变量,只与的常量值即可确定编译时间,如mac ros,literals等

2

I keep getting the error: initializer element is not constant.

全局变量和静态变量只能在编译时已知的常量表达式进行初始化。

Isn't n constant by the time the function compiles?

答案是否定的。 n存储从stdin收到的价值。因此,它在运行时收到该值。