20

我来自 javascript/php/python 可能我遗漏了一些东西,这里是代码:

const int a = 50;
const int c = 100;
const int d = 100;
int endX = c + a;
int endY = d;
int startX, startY, b;

我明白了

ex1.4.c:6:错误:初始化元素不是常量
ex1.4.c:7:错误:初始化元素不是常量

有人有解释吗?

4

5 回答 5

19

不幸的是,在 C中,const变量并不是真正的 const。

以下是 c99 标准的摘录。

6.7.8 初始化

  1. 具有静态存储持续时间的对象的初始化程序中的所有表达式都应为常量表达式或字符串文字

常量定义如下:

6.4.4 常量

句法

持续的:

integer-constant       (e.g. 4, 42L)
floating-constant      (e.g. 0.345, .7)
enumeration-constant   (stuff in enums)
character-constant     (e.g. 'c', '\0')

该标准定义常量表达式如下:

6.6 常量表达式

(7) 初始化器中的常量表达式允许更大的自由度。这样的常量表达式应为或评估为以下之一:

— 算术常数表达式,

— 一个空指针常量,

— 地址常数,或

— 对象类型的地址常量加上或减去整数常量表达式。

(8) 算术常量表达式应具有算术类型,并且 只能具有整数常量、浮点常量、枚举常量、字符常量和 sizeof 表达式的操作数。算术常量表达式中的强制转换运算符只能将算术类型转换为算术类型,但作为结果为整数常量的 sizeof 运算符的操作数的一部分除外。

因此,canda不是常量表达式,在您的情况下不能用作初始化程序。

于 2012-10-05T17:25:20.263 回答
7

const与 C++ 不同,表达式在 C 中必须是编译时常量,因此c+a不能用作常量。在 C 中处理此问题的常用方法是使用预处理器

#define A 50
#define C 100
#define D 100
int endX = C + A;
int endY = D;
int startX, startY, b;
于 2012-10-05T17:40:10.653 回答
5

如果您将 endX 声明为全局变量,则该错误是有意义的。

原因是全局变量是在编译时初始化的,而您试图将 endX 初始化为必须在执行时完成的操作。

于 2012-10-05T17:04:42.587 回答
3

是的,您不能将某些东西初始化为变量。编译器进行初始化,在编译时它不知道 ; 的值c+a

int x = 1;类型初始化很好,编译器只是将 a放在目标代码中1的地址处。x

要将某些东西初始化为c+a,您希望在运行时,在启动代码中c或中的构造函数中进行C++

于 2012-10-05T17:04:20.987 回答
0

在 C 编程语言中,具有静态存储持续时间的对象必须使用常量表达式(或包含常量表达式的聚合)进行初始化。如果endX具有静态存储持续时间,则其初始化(c+a)程序不是常量表达式(即无法在翻译阶段计算表达式)。

于 2012-10-05T17:22:19.450 回答