同样是const,为什么结果不一样?

描述

昨天有个学生去做C/C++软件工程师的笔试题,遇到了这么一个题目,来问我结果是多少?

CONST

看似非常普通的一道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语言。

审核编辑 :李倩

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分