const在C和C++中的区别

昨天有个学生去做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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值