啊啊 c++问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 14:26:47
const char a='c';
char*p=(char*)&a;
*p='a';
cout<<a<<*p;

为什么a和*p输出的不同??

其实是一样的,只不过是编译器背后对常量做了手脚罢了。编译器直接把你的常量COpy到寄存器中,而内存中的常量其实已经被非法修改了,而寄存器中的变量和内存中的变量已经不相同了。

所以输出的时候会始终输出寄存器中的变量的值而不会再检查内存中的。

如果你是C++的话那么这么改一下就OK了:

const volatile char a='c';

char*p=(char*)&a;

*p='a';

cout<<a<<*p;

volatile会强迫把寄存器中的数据COPY会内存,这样当发生修改的时候,寄存器和内存的值会是一样的,这样运行起来结果就=对了:

aa请按任意键继续. . .

补充:
会这么做的原因是编译器单方面认为你声明的常量将在整个生命期中不会被修改,然而实际上被你通过特殊方法修改了而它却不知道,所以说我们推荐使用C++的类型转换而不是C的类型转换。另外我们也应该避免修改常量的值。其实volatile和const一起存在本身就是不值得提倡的。

在C++中,你会发现char*p=(char*)&a; 这句代码是不能通过编译的,原因是p不是一个指向常量的字符指针,所以它不能指向a。

既然你通过编译了,那么你说明程序按照代码执行了,按思路最后应该输出aa;但是也没有如愿。

只能是一种解释了(引用: _鈊_烦_薏乱 ):
其实是一样的,只不过是编译器背后对常量做了手脚罢了。编译器直接把你的常量COpy到寄存器中,而内存中的常量其实已经被非法修改了,而寄存器中的变量和内存中的变量已经不相同了。

所以输出的时候会始终输出寄存器中的变量的值而不会再检查内存中的。

希望可以帮到你~