作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
我们先看看以下代码:
#include <stdio.h>
int main()
{
const int a = 1;
a = 2;
printf("%d/n", a);
return 0;
}
你一看就知道这个一定在编译的时候报错:assignment of read-only variable a。
所以你知道了变量a被定义为const是只读而不能改变的,但事实是这样的吗?
请看下边的代码:
#include <stdio.h>
int main()
{
const int a = 1;
int *b = &a;
*b = 2;
printf("%d %d", a, *b);
return 0;
}
编译发觉竟然通过了,结果你先猜猜,咱们先拿编译通过这个事情说事。
你设定一个变量为const时,编译器就会拍拍胸脯的告诉你这个内存地址的值通过这个变量名字是不会被改变的,但请注意它仍然可以被任意外部程序甚至是同一个程序的其他名字而更改。
那我们现在看看到底这个程序的结果是什么:
2 2
其实这个程序的结果没有任何代表性,我用的是GCC4.2.4,这并不代表所有编译器都是这样的结果,就相当于并不是VC就是C/C++语言一样。我们看看C语言的标准是怎么说的:
If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.
那就是说这事还没准儿呢!
那我们还使用const有什么用呢,既然它也可以被更改,而且结果还不确定。
简要来说有以下两个主要用途:
1.防止程序无意中错误的修改了一些只需对其进行访问的变量。
2. 使编译器知道这个值是不会改变的,它会因此对你的程序有所优化。它优化的方式主要有两种:一个是将变量值同时寄存于寄存器中,这样即使通过*b修改了a,读取它的值时还是会去读寄存器中原来的值。第二个是,它甚至会在所有程序中用到a的地方将变量a替代为设定的常量值,比如这个程序中就是1。
这下你明白了吧,以后不要听砖家(比如说我)乱说,自己去翻翻ANSI C的标准。