我阅读了有关 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] 是只读/常量,同时它声明 testArray[0] 不是常量! 我确实回答自己“显然解引用运算符 [ ] 无法在“编译时”常量初始化上工作,那么为什么这行代码编译时不会出现错误?
const short* testItem=&(testArray[1]);
还请注意,这里我获取了数组中第二项的地址。因此“编译时”常量初始化可以毫无问题地取消引用!
对此有何解释?
最佳答案
对于具有静态存储持续时间的变量,初始值设定项必须由常量表达式组成。其中包括:
- 算术常量表达式:只能具有整数/枚举/字符/浮点常量和
sizeof
表达式的操作数。它们可能不引用其他变量的值。 - 空指针常量。
- 地址常量,可以选择添加到整数常量表达式中。该地址常量可以为空、指向函数或指向具有静态存储持续时间的对象。该标准允许使用
[]
和&
等运算符,只要您不引用对象的值即可。
在本例中,由于引用了另一个变量中存储的值,因此 testArray[1]
不是常量表达式,但 &testArray[1]
是地址常量and 是一个有效的常量表达式。
引用:C99 标准,第 6.6 节。
关于C const 数组元素不是真正的 const 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28263911/