符号常量可以在main()中进行赋值么?
rt,如果不删除第五行 编译出错
2015-01-10
严格意义上来讲,C语言并没有绝对的常量这个概念。const是一个C语言的关键字,它限定了一个变量不允许被改变。
例如:下面代码
#define N 10
int main()
{
int arr[N]; //编译通过,因为这里N被宏替换为10
return 0;
}
但是,
int main()
{
int const N =10;
int arr[N]; //编译不通过,因为编译器认为N是个变量,不是常量。只不过这个变量不允许被修改
}
而且在C语言中被const修饰的就一定是常量吗?真的能不动如山吗?
例如下面代码:
const int a = 10;
int *pa = &a;
*pa = 20;
printf("%d/n",*pa);
printf("%d/n",a);
编译时候,只是有个警告并没有错误,而且运行时,a的值也修改为20了。
要真正保证不能修改a,代码修改如下:
const int a = 10;
const int *pa = &a; //或者int const *pa=&a;
*pa = 20;
printf("%d/n",*pa);
printf("%d/n",a);
-------------------------------------------------------------------------
说这番话的目的想告诉大家,C由于是个比较原始古老的语言,在设计初考虑的不像C++,Java等这些语言严谨。对于常量在C中,其实没有严格意义上的常量类型。const的目的只是限定一个变量不允许修改,换句话说,它的值对这个符号来说是只读的,但是并不能防止通过程序的内部(或者说外部)的方法来修改这个值。所以,我可以简单理解为const是修饰的变量只是一个只读的变量而已。
#define POCKETMONEY 10
这一句并不是定义一个变量。
#define 是一个预处理指示,预处理器会把代码中的 POCKETMONEY 替换成 10,再交给编译器编译。所以你的代码就是
printf("小明今天又得到%d元零花钱\n", 10);
所谓“常量”的概念编译器是不知道的,因为交给编译器的代码中根本就没有'POCKETMONEY'这个符号。
这种写法通常是为了方便我们编程。假设代码中有很多地方写了 10 这个字面量,但突然你想要把 10 改成 20,那么就需要在整个代码中搜索10,还必须确定这个'10'是你想要改的那个量,实在是很麻烦,且容易出错。 所以就用#define定义一个10的“代号”,这样如果你想改动这个值,只需要把#define中的10改掉即可。
但是,这种写法是不推荐的!!
原因如上所说,因为编译器并不知道'POCKETMONEY'这个符号,所以也无法进行相应的类型检查之类的,除了错误也无法正确提示,会带来无穷无尽的问题...
推荐的写法是:
用const关键字来定义一个变量,这种用const修饰过的变量的值是无法更改的,这样就有了“常量”的语义。
举报