对 const 的思考

用const 修饰的数值,1般是不可修改的,但在C语言中,可以通过变量的地址来修改其内容。

#include <stdio.h>

int main(int argc, char *argv[])
{
const int i = 10;
int *p = &i; // 取i 的地址
*p = 100; // 修改地址里面的内容
//i = 0; // 报错!
printf("*p = %d, i = %d
", *p, i);

return 0;
}

结果:


const 修饰的数值已被修改了。


但是如果在C++中这么做,那末编译器会报错,说明C++的编译检查更加严格,那末依照通过变量地址来修改其变量的想法,进行修改。

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
const int i = 10;
int addr = (int)&i;
int *p = (int*)addr;

*p = 100; // 通过地址修改i 的值

cout<<"*p = "<<*p<<", i = "<<i<<endl;

return 0;
}

结果


i 的数值没有产生变化?!

调试:



在调试结果中,i 的数值已是100了,打印的结果却还是原来的数值,通过反汇编代码可以看到,push 0AH。

也就是在打印的时候,并没有从i 的地址中重新去取数值,而是直接将i原始的结果push进去,所以结果没有变化。

是否是所有const修饰的数值,其使用和赋值都是通过原始的数值,而不是再从地址去数值?

简单测试代码:

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
const int i = 10;
const int j = 100;
int k = 0;

k = i;
k = j;

cout<<i<<", "<<j<<endl;

return 0;
}

结果:


果然在C++中,从反汇编结果中知道,用const修饰的数值,在使用的时候,不会再从与本来的地址中取数值了,应当是用const修改的数值,被寄存在寄存器中了,直接从寄存器中取值,而不会再从地址取值。

一样1段代码,如果用C语言编译,则会从本来的地址中取值。


总结:在反汇编代码中,加上 const 与没有加上 const 的反汇编代码是1样的,说明const 对实际代码并没有产生特别的影响,那末可知,const 只影响到编译器,也就是编译器会对const指向的数值进行检查,所以严格来讲,const 修饰的不是1个常量,而是编译器的1种编译检查,应当说是变量的不可修改性。


对const修饰的变量,在使用时:

在C语言中,会从本来的变量地址中,获得数值。(便可以通过变量的地址来修改const修饰的变量)

在C++语言中,不会从本来的变量地址中获得数值。(即即便通过变量的地址成功修改变量了,其变量在使用时,由于不会从地址中获得数值,所以还是本来的数值,说明C++的编译机制,更加保证了const修饰的变量的不可修改性)

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 对 const 的思考

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡