C++ C++;Const_Cast是否会引入新变量? #包括 使用名称空间std; int main(){ 常数INTA=2; 常数int*p=&a; int*p2=常数(p); *p2=5; char*p3=(char*)&a; cout

C++ C++;Const_Cast是否会引入新变量? #包括 使用名称空间std; int main(){ 常数INTA=2; 常数int*p=&a; int*p2=常数(p); *p2=5; char*p3=(char*)&a; cout,c++,const-cast,C++,Const Cast,未定义的行为意味着任何事情都可能发生。包括这个 5.2.11施工定额[施工定额表] 7) [注意:根据对象的类型,通过指针、左值或指针执行写入操作 对于由丢弃常量限定符73的常量强制转换产生的数据成员,可能会产生未定义的 行为(7.1.6.1)。-结束注释] 潜在的原因可能是编译器看到a是如何const,优化cout未定义的行为意味着任何事情都可能发生。包括这一点 5.2.11施工定额[施工定额表] 7) [注意:根据对象的类型,通过指针、左值或指针执行写入操作 对于由丢弃常量限定符73的常量强

未定义的行为意味着任何事情都可能发生。包括这个

5.2.11施工定额[施工定额表] 7) [注意:根据对象的类型,通过指针、左值或指针执行写入操作 对于由丢弃常量限定符73的
常量强制转换产生的数据成员,可能会产生未定义的
行为(7.1.6.1)。-结束注释]


潜在的原因可能是编译器看到
a
是如何
const
,优化
cout未定义的行为意味着任何事情都可能发生。包括这一点

5.2.11施工定额[施工定额表] 7) [注意:根据对象的类型,通过指针、左值或指针执行写入操作 对于由丢弃常量限定符73的
常量强制转换产生的数据成员,可能会产生未定义的
行为(7.1.6.1)。-结束注释]


潜在的原因可能是编译器看到
a
是如何
const
,优化了
cout这就是您误入歧途的地方:

        cout << "a is " << a << endl;
00CE1581  mov         esi,esp  
00CE1583  mov         eax,dword ptr [__imp_std::endl (0CFD30Ch)]  
00CE1588  push        eax  
00CE1589  mov         edi,esp  
//...
00CE158B  push        2 
//...
00CE158D  push        offset string "a is " (0CE7840h)  
00CE1592  mov         ecx,dword ptr [__imp_std::cout (0CFD308h)]  
00CE1598  push        ecx  
00CE1599  call        std::operator<<<std::char_traits<char> > (0CE1159h)  
00CE159E  add         esp,8  
00CE15A1  mov         ecx,eax  
00CE15A3  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0CFD304h)]  
00CE15A9  cmp         edi,esp  
00CE15AB  call        @ILT+415(__RTC_CheckEsp) (0CE11A4h)  
00CE15B0  mov         ecx,eax  
00CE15B2  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0CFD300h)]  
00CE15B8  cmp         esi,esp  
00CE15BA  call        @ILT+415(__RTC_CheckEsp) (0CE11A4h)  
intmain(){
常数INTA=2;
常数int*p=&a;
int*p2=常数(p);
*p2=5;

在这里的最后一行,您为一个变量指定了一个指针,该指针指向实际常量。也就是说,
a
const
p2
指向
a
。如果不调用未定义的行为,您无法更改
a
的值,即使通过
p2

<一个误入歧途:

        cout << "a is " << a << endl;
00CE1581  mov         esi,esp  
00CE1583  mov         eax,dword ptr [__imp_std::endl (0CFD30Ch)]  
00CE1588  push        eax  
00CE1589  mov         edi,esp  
//...
00CE158B  push        2 
//...
00CE158D  push        offset string "a is " (0CE7840h)  
00CE1592  mov         ecx,dword ptr [__imp_std::cout (0CFD308h)]  
00CE1598  push        ecx  
00CE1599  call        std::operator<<<std::char_traits<char> > (0CE1159h)  
00CE159E  add         esp,8  
00CE15A1  mov         ecx,eax  
00CE15A3  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0CFD304h)]  
00CE15A9  cmp         edi,esp  
00CE15AB  call        @ILT+415(__RTC_CheckEsp) (0CE11A4h)  
00CE15B0  mov         ecx,eax  
00CE15B2  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0CFD300h)]  
00CE15B8  cmp         esi,esp  
00CE15BA  call        @ILT+415(__RTC_CheckEsp) (0CE11A4h)  
intmain(){
常数INTA=2;
常数int*p=&a;
int*p2=常数(p);
*p2=5;

在这里的最后一行,您为一个变量指定了一个指针,该指针指向实际常量。也就是说,
a
const
p2
指向
a
。如果不调用未定义的行为,您无法更改
a
的值,即使通过
p2
,也无法更改
的值。

这是未定义的行为。

这是未定义的行为更改常量。更改常量是未定义的行为。+1用于通过编译代码进行解释。我知道了。谢谢你的帮助!!顺便说一句,你能解释一下如何进行钓鱼吗?如何使用这样的程序集进行调试?你能给出一些提示吗?谢谢!@user1582802取决于你拥有的IDE/工具。我使用MS visual studio、 你可以在调试过程中切换到汇编-右时钟->显示反汇编。+1通过编译代码进行解释。我知道了。谢谢你的帮助!!顺便说一句,你能不能解释一下如何钓鱼?如何使用这样的汇编进行调试?你能给些提示吗?谢谢!@user1582802取决于你拥有的IDE/工具。I use MS visual studio,您可以在调试期间切换到汇编-右时钟->显示反汇编。
int main() {
        const int a = 2;
        const int *p = &a;
        int *p2 = const_cast<int*>(p);
        *p2=5;