C++ C++;Const_Cast是否会引入新变量? #包括 使用名称空间std; int main(){ 常数INTA=2; 常数int*p=&a; int*p2=常数(p); *p2=5; char*p3=(char*)&a; cout
未定义的行为意味着任何事情都可能发生。包括这个 5.2.11施工定额[施工定额表] 7) [注意:根据对象的类型,通过指针、左值或指针执行写入操作 对于由丢弃常量限定符73的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的常量强
常量强制转换产生的数据成员,可能会产生未定义的
行为(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;