目录
三、添加volatile修饰后,分析C和C++中const常量被修改后值的状态
3.1 添加volatile修饰后,C中const常量被修改后值的状态
3.2 添加volatile修饰后,C++中const常量被修改后值的状态
3.3 添加volatile修饰后,C和C++中const常量被修改后值的状态分析结论
四、针对const常量在C和C++里分析volatile修饰前后值被修改的状态的结论
一、写在前面
1. 由于涉及到编译器层面,所以不同编译器结果可能不一样。本文使用的VS编译器。
2. 针对const修饰的整型常量:
const int local = 10;
3. 常量本质上也是一个变量,是变量就会有地址;
因为直接修改const常量是不允许的(编译就会报错),所以只能通过指针修改其地址上的值来试验。如下:
这里注意下,用vs复制一个文件到另一个文件运行(比如这里程序都是一样的,一个在c运行,一个在cpp运行,复制过去不清理解决方案,运行的其实还是上一个程序),但是编译器选择不同时,需要重新生成解决方案,不然运行的还是上一次的程序。
4.分析的问题及结论
const变量被修改后,常量本身值的修改情况 | const变量被修改后,常量对应的内存空间中的值的修改情况 | |
---|---|---|
C环境下 | 会被修改 | 会被修改 |
C++环境下 | 不会被修改 | 会被修改 |
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对应