C const 数组元素不是真的const 吗?
C const array elements are not really const?
关于 "compile time constants" 在 C 中,我尽我所能阅读了所有内容,但我还不能对以下内容做出解释:
const short testArray[2]={1,2};
//void IndeedConst(void){ testArray[0]=3; } //correctly reports "error: assignment of read-only location 'testArray[0]'"
const short testItem=testArray[0]; //why "error: initializer element is not constant"??
所以编译器抱怨 testArray[0] 被读取 only/const,同时它声明 testArray[0] 不是常量!
我确实在编译时回答了自己 "evidently the dereferencing operator [ ] cannot work " 常量初始化,那么为什么这些行可以编译而没有错误?
const short* testItem=&(testArray[1]);
另请注意,这里我获取的是数组中第二项的地址。因此 "compile time" 常量初始化 可以 取消引用没有问题!
对此有何解释?
对于具有静态存储持续时间的变量,初始化器必须由常量表达式组成。其中包括:
- 算术常量表达式:这只能有 integer/enum/character/floating 常量和
sizeof
表达式的操作数。它们可能不引用其他变量的值。
- 空指针常量。
- 地址常量,可选择添加到整数常量表达式。这个地址常量可以为空,指向一个函数,或者指向一个具有静态存储持续时间的对象。只要您不引用对象的值,该标准就允许使用
[]
和 &
等运算符。
在这种情况下,testArray[1]
不是常量表达式,因为它引用存储在另一个变量中的值,但&testArray[1]
是一个地址常量,是一个有效的常量表达式。
参考:C99 标准,第 6.6 节。
关于 "compile time constants" 在 C 中,我尽我所能阅读了所有内容,但我还不能对以下内容做出解释:
const short testArray[2]={1,2};
//void IndeedConst(void){ testArray[0]=3; } //correctly reports "error: assignment of read-only location 'testArray[0]'"
const short testItem=testArray[0]; //why "error: initializer element is not constant"??
所以编译器抱怨 testArray[0] 被读取 only/const,同时它声明 testArray[0] 不是常量! 我确实在编译时回答了自己 "evidently the dereferencing operator [ ] cannot work " 常量初始化,那么为什么这些行可以编译而没有错误?
const short* testItem=&(testArray[1]);
另请注意,这里我获取的是数组中第二项的地址。因此 "compile time" 常量初始化 可以 取消引用没有问题!
对此有何解释?
对于具有静态存储持续时间的变量,初始化器必须由常量表达式组成。其中包括:
- 算术常量表达式:这只能有 integer/enum/character/floating 常量和
sizeof
表达式的操作数。它们可能不引用其他变量的值。 - 空指针常量。
- 地址常量,可选择添加到整数常量表达式。这个地址常量可以为空,指向一个函数,或者指向一个具有静态存储持续时间的对象。只要您不引用对象的值,该标准就允许使用
[]
和&
等运算符。
在这种情况下,testArray[1]
不是常量表达式,因为它引用存储在另一个变量中的值,但&testArray[1]
是一个地址常量,是一个有效的常量表达式。
参考:C99 标准,第 6.6 节。