昨天有个学生去做C/C++软件工程师的笔试题,遇到了这么一个题目,来问我结果是多少?
看似非常普通的一道C语言题目,如果不指定编译器,还真不知道结果是多少。
不信我来演示给你看下。
首先是用gcc来编译,就是C语言的编译器,语法没有问题,运行结果,num = 2。
root@Turbo:test# gcc test.c -o test
root@Turbo:test# 。/test
num = 2
root@Turbo:test#
同样的代码,换成g++来编译,就是C++的编译器,结果是num = 1。
root@Turbo:test# g++ test.c -o test
root@Turbo:test# 。/test
num = 1
root@Turbo:test#
都说C++是兼容C语言的,为什么在处理结果上却不同。
其实说兼容当然是没问题的,只是C语言和C++中const的作用不同。
C语言中,const修饰的是只读变量,意思是不能通过变量本身去修改对应内存的值,但是可以通过其他方式去修改,比如指针。代码中确实也是通过指针来修改的,所以num对应的那块内存值变了。
但是在C++中,const修饰的就是一个常量,跟define定义的宏有点类似,它存放在符号表中,接下来只要遇到这个常量,直接就是替换。
那么问题就来了,既然它没有存放在内存中,为什么代码中还能对他进行取地址的操作。
这一点主要还是为了兼容C语言,强行对它取地址,编译器会分配一块内存,并且把常量的值填在内存里面,然后取这块内存的地址进行运算。但是整个过程并不会影响常量的属性,代码下面遇到,还是直接替换。
const在C++中还有很多用处,修饰成员变量、修饰成员函数,所以学完了C语言,如果有精力,可以去看看C++,不为别的,学习C++可以更好的理解C语言。
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !