【问题标题】:Explanation of code snippet containing const_cast包含 const_cast 的代码片段说明
【发布时间】:2015-10-16 07:27:26
【问题描述】:
int main() {
  const int i =10;
  int *j = const_cast<int*>(&i);
  cout<<endl<<"address of i "<<&i;
  cout<<endl<<"value of  j "<<j;
  (*j)++;
  cout<<endl<<"value of  *j "<<*j;
  cout<<endl<<"value of i "<<i;
  // If Not use Const //
  int k = 10;
  int *p = &k;
  cout<<endl<<"address of k "<<&i;
  cout<<endl<<"address of p "<<&p;
  (*p)++;
  cout<<endl<<"value of  *p "<<*p;
  cout<<endl<<"value of  k  "<<k<<endl;
}

输出是:

i0xbf8267d0的地址
j 0xbf8267d0 的值
*j 11 的值
i 10 的值
k 0xbf8267d0的地址
p0xbf8267c8的地址
*p 11 的值
k 11 的值

有人可以在输出的第 3 行和第 4 行解释原因吗

*j is 11i is 10

为什么i 也不是 11?

【问题讨论】:

标签: c++ c++11


【解决方案1】:

编译器可以假定在这种情况下不会修改 const 变量。它可以采取措施生成更高效的代码。在您的示例中,由于i 被声明为const,编译器将std::cout &lt;&lt; i 替换为(有效地)std::cout &lt;&lt; 10

抛弃 const 会导致未定义的行为,因此实际上不会发生任何事情。

考虑类似的事情

const int i = 5;
// ...
if (i > 10) { // impossible!
    std::cout << "hello world!";
}

在上面,优化编译器可以在编译时找出常量 5 不可能大于 10,所以如果你查看它,它将放弃 if 检查和正文程序集,您甚至不会看到 "hello world!" 字符串,因为它会被优化并丢弃!即使您将 ... 替换为 const_cast 并修改了 i 的值,这也不会更改允许编译器执行的优化(假设 i 没有更改)。

【讨论】:

  • @SaurabhSharma 如果其中一个答案解决了您的问题,请单击左侧的勾号将其标记为已接受。然后,您还可以考虑对有用的答案进行投票。这是说“谢谢!”的最佳方式。在这个网站上。
【解决方案2】:

解释很简单:未定义的行为是未定义的。 当您使用const_cast 丢弃实际上声明为const 的对象的常量然后对其进行修改时,您的程序会出现未定义的行为它可以做任何事情。它可以做你期望的事情,做你不期望的事情,它可以在线订购披萨。

在您的特定情况下,编译器可能优化了 i 的所有用法,将其替换为文字 10(因为 iconst,因此它的值永远不会以任何方式改变)。

同时,i 可能没有放在内存的只读部分中(否则,您会在(*j)++ 上崩溃),因为j 是指向int 的指针(而不是const int),从*j 读取的数据不能被优化掉,因此实际存储在*j(这是i 的存储空间)中的值会被打印出来。

但以上只是猜测,真的。真正的原因可能是任何事情。具有未定义行为的程序是完全错误的,无法预测其行为。

【讨论】:

  • “在线订购披萨” :) 太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2012-08-12
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多