【发布时间】:2017-03-28 16:44:31
【问题描述】:
我发现了一个有趣的事实,但我不明白它是如何工作的。
以下代码完美运行。
#include <stdio.h>
int main(){
const int size = 10;
int sampleArray[size];
typedef char String [size];
return 0;
}
然后,我尝试仅使用具有全局范围的常量变量,它仍然可以。
#include <stdio.h>
const int size = 10;
int main(){
int sampleArray[size];
typedef char String [size];
return 0;
}
但是,如果我也将数组的范围更改为全局,我会得到以下结果:
错误:在文件范围内对“sampleArray”进行了可变修改
#include <stdio.h>
const int size = 10;
int sampleArray[size];
typedef char String [size];
int main(){
return 0;
}
我没听懂!如果我将 const 变量替换为 ex。到#define 也可以。
我知道 #define 变量是经过预处理的,据我所知 const 变量只是只读的。但究竟是什么构成了全局范围?
我不明白第三段代码有什么问题,如果第二段还可以的话。
【问题讨论】:
-
一些细节:C 有
const对象,但没有 constant 对象。虽然const似乎暗示了constant,但const对象不是constant,而是更像“这个对象不应该改变,但如果尝试改变——谁知道会发生什么吗?”在 C 中,真正的 constant 是类似42的代码,它是一个类型为int的 整数常量。因此const int size = 10;不是 constant 变量。 -
数组没有固定大小,是变长数组。
-
就像他们说的,C 有
const对象,它们实际上是只读的变量。参照。 C++,它具有真正的const对象,这些对象实际上是编译时 constants。 -
a
const变量是编译器不允许修改的变量,而是一个变量。认为值在编译时可能是未知的(因为它可能来自其他文件)但数组大小必须是,所以它是禁止的。