对于一个程序的思考1(const与 volatile)


#include<stdio.h>

int main()
{
	 const int i=0;
	 int *j=(int *)&i;
	 *j=1;
	 printf("%d,%d\n",i,*j);


    return 0;
}

对于上边这个看似简单的程序却是深藏玄机

windows平台

1.在  .c 文件中输出是      1,1  ,深究原因是因为 const 在.c文件中定义的变量是只读的但是还是个变量 ,不可以显示更改如 i=1,但是可以通过地址间接进行更改  

2.在  .cpp 文件中 输出是 0,1  ,深究原因是因为 const 在.cpp文件中定义的变量在预编译时就已经用  0  把  i  替换,因为编译器优化了,认为所有符号 i 都是 0,虽然在编译时为变量分配内存,但是如何间接直接改变都不会影响输出结果

LINUX 平台  

与 WINDOWS平台结果一致


再看底下这个程序

#include<stdio.h>

int main()
{
	 volatile const int i=0;
	 int *j=(int *)&i;
	 *j=1;
	 i=1;
	 printf("%d,%d\n",i,*j);
     
	 return 0;
}

windows平台

1.在  .c 文件中输出是      1,1   volatile 在.C基本只是让编译器减少优化,这里是消除const,值是在.c 文件里体现的不明显

2.在  .cpp 文件中 输出是 1,1 volatile 在.C基本只是让编译器减少优化,这里是消除const,从而使变量 i可以被修改

LINUX 平台  

与 WINDOWS平台结果一致


    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值