C和C++里的const常量、volatile修饰符的深层次说明

目录

一、写在前面

二、分析C和C++中const常量被修改后值的状态

2.1 C中const常量被修改后值的状态

 2.2 C++中const常量被修改后值的状态

2.3 C和C++中const常量被修改后值的状态分析结论

三、添加volatile修饰后,分析C和C++中const常量被修改后值的状态

3.1 添加volatile修饰后,C中const常量被修改后值的状态

3.2 添加volatile修饰后,C++中const常量被修改后值的状态

3.3 添加volatile修饰后,C和C++中const常量被修改后值的状态分析结论

四、针对const常量在C和C++里分析volatile修饰前后值被修改的状态的结论

4.1 C中

4.2 C++中

五、原因

5.1 C中对const没有优化,C++存在const优化

5.2 局部const常量和全局const常量

5.3 借用评论区的说法

5.4 volatile优化



一、写在前面

1. 由于涉及到编译器层面,所以不同编译器结果可能不一样。本文使用的VS编译器。

2. 针对const修饰的整型常量:

const int local = 10;

3. 常量本质上也是一个变量,是变量就会有地址
因为直接修改const常量是不允许的(编译就会报错),所以只能通过指针修改其地址上的值来试验。如下:

 这里注意下,用vs复制一个文件到另一个文件运行(比如这里程序都是一样的,一个在c运行,一个在cpp运行,复制过去不清理解决方案,运行的其实还是上一个程序),但是编译器选择不同时,需要重新生成解决方案,不然运行的还是上一次的程序。

4.分析的问题及结论

不加volatile修饰的const常量修改分析
const变量被修改后,常量本身值的修改情况 const变量被修改后,常量对应的内存空间中的值的修改情况
C环境下 会被修改 会被修改
C++环境下 不会被修改 会被修改
加volatile修饰的const常量修改分析
const变量被修改后,常量本身值的修改情况 const变量被修改后,常量对应的内存空间中的值的修改情况
C环境下 会被修改 会被修改
C++环境下 会被修改 会被修改

5.整体代码

c部分:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
	const int local = 10;

	printf("修改前:\n");
	printf("修改前local本身的值 : %d \n", local);
	printf("修改前local的地址: %x \n", &local);

	int *ptr = (int*)&local;
	*ptr = 100;
	printf("修改后:\n");
	printf("修改后local本身的值: %d \n", local);
	printf("修改后local对应的内存空间中的值:: %d \n", *ptr);
	printf("修改后local的地址: %x \n", &local);
	printf("\n\n");
	printf("测试添加volatile修饰符:\n");


	/****** 添加volatile避免编译器的优化 ********/
	const volatile int local2 = 10;
	printf("修改前:\n");
	printf("修改前local2本身的值 : %d \n", local2);
	printf("修改前local的地址: %x \n", &local2);

	int *ptr2 = (int*)&local2;
	*ptr2 = 100;
	printf("修改后:\n");
	printf("修改后local2本身的值: %d \n", local2);
	printf("修改后local2对应的内存空间中的值:: %d \n", *ptr2);
	printf("修改后local2的地址: %x \n", &local2);

	return 0;
}

输出结果:

C++部分

#include <iostream>
#include<stdio.h>
using namespace std;

int main(){
	const int local = 10;

	printf("修改前:\n");
	printf("修改前local本身的值 : %d \n", local);
	printf("修改前local的地址: %x \n", &local);

	int *ptr = (int*)&local;
	*ptr = 100;
	printf("修改后:\n");
	printf("修改后local本身的值: %d \n", local);
	printf("修改后local对应的内存空间中的值:: %d \n", *ptr);
	printf("修改后local的地址: %x \n", &local);
	printf("\n\n");
	printf("测试添加volatile修饰符:\n");


	/****** 添加volatile避免编译器的优化 ********/
	const volatile int local2 = 10;
	printf("修改前:\n");
	printf("修改前local2本身的值 : %d \n", local2);
	printf("修改前local的地址: %x \n", &local2);

	int *ptr2 = (int*)&local2;
	*ptr2 = 100;
	printf("修改后:\n");
	printf("修改后local2本身的值: %d \n", local2);
	printf("修改后local2对应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子木呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值