C 初始值设定项必须是常量

C 初始值设定项必须是常量,c,C,我试图学习C语言,但在下面的代码中出现了一个错误。 如果我在卷中使用半径,我会得到一个错误:error\2069:初始值设定项必须是常量。 #include <stdio.h> #define PI (3.14) /* Define radius*/ int radius = 10; float volume = ( 4.0f / (3.0f * PI * radius) ); int main(void){ return 0; } #包括 #定义PI(3.14) /*定义半

我试图学习C语言,但在下面的代码中出现了一个错误。

如果我在卷中使用半径,我会得到一个错误:
error\2069:初始值设定项必须是常量。

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
float volume = ( 4.0f / (3.0f * PI * radius) );

int main(void){

return 0;
}
#包括
#定义PI(3.14)
/*定义半径*/
int半径=10;
浮动体积=(4.0f/(3.0f*PI*半径));
内部主(空){
返回0;
}
但当我用一个实际的数字来改变半径时,它编译的很好

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
float volume = ( 4.0f / (3.0f * PI * 10) );

int main(void){

    return 0;
}
#包括
#定义PI(3.14)
/*定义半径*/
int半径=10;
浮动容积=(4.0f/(3.0f*PI*10));
内部主(空){
返回0;
}

为什么会发生这种情况?我该怎么做才能使第一个版本正常工作?

在C中,您只能使用常量表达式初始化函数外部的变量
int radius
不是一个常量表达式。

在这方面,常量是没有内存地址的东西<代码>半径有一个内存地址,因此不能用于初始化。

在C语言中,不能用非常量表达式初始化全局变量

C99标准:第6.7.8节:

具有静态存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字


在您的示例中,
volume
是具有静态存储持续时间的全局变量,
radius
不是常量。因此出现了错误

< P>它只是C,不是C++,所以<代码> RADIUS <代码>必须是常数,但是如果你想把它作为变量。 将
main()中的
volume
定义为

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;
int main(void){
float volume = ( 4.0f / (3.0f * PI * radius) );
return 0;
}
#包括
#定义PI(3.14)
/*定义半径*/
int半径=10;
内部主(空){
浮动体积=(4.0f/(3.0f*PI*半径));
返回0;
}

现在,错误可能会消失。

静态对象不能用非常量表达式初始化。以你为例,

float volume = ( 4.0f / (3.0f * PI * radius) );
volume
是一个全局变量,具有静态持续时间。所以它不能用非常量表达式初始化

但是,如果
volume
是一个局部变量,则可以使用C99中的非常量值对其进行初始化。因此,在
C99
中允许以下操作(非常量初始化)

#include <stdio.h>
#define PI (3.14)

/* Define radius*/
int radius = 10;

int main(void){
float volume = ( 4.0f / (3.0f * PI * radius) );
return 0;
}
#包括
#定义PI(3.14)
/*定义半径*/
int半径=10;
内部主(空){
浮动体积=(4.0f/(3.0f*PI*半径));
返回0;
}

但这在C90中是无效的,在C90中,所有的初始值都必须是常量表达式。

因为初始值必须是常量,我可以问一下为什么体积是全局变量,而半径不是吗?@intelis,你混淆了术语
radius
是一个全局变量,但它不是一个常量表达式。@intelis:volume
和radius都位于文件中任何函数的外部(而不是TU),因此它们都是全局变量,并且具有静态存储持续时间。两者都应该用常量表达式初始化。请注意,它们都不是常数表达式。我不明白,为什么体积不是常数,如果它有一个不变的值。我的意思是,半径和体积作为常量有什么区别?@intelis:你说体积是常量,因为它的值在程序中的任何地方都不会改变。对于C和你的编译器,变量只有在显式声明为常量时才是常量。例如:
const int x
告诉编译器
x
是常量。不过还有更多细节。正如标准引文所说,初始值设定项应该是常量表达式,在C中(与C++不同)
const
声明不会生成常量表达式。因此,即使
const int radius=10您的代码将显示。在C语言中,产生常量表达式的方法是使用
#define
的符号。所以int在c中是非静态对象,而float是静态对象?区别是什么?不,它不是
int
vs
float
的东西。全局变量具有静态持续时间,而局部变量具有自动持续时间。在我的回答中,
volume
是一个局部变量,
radius
(静态对象)是一个全局变量。对象的类型并不重要,而是它们在何处以及如何声明才有区别。