亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

內存地址相同的兩個不同的值

內存地址相同的兩個不同的值

C++
慕萊塢森 2019-07-03 10:38:34
內存地址相同的兩個不同的值電碼#include <iostream>using namespace std;int main() {     const int N = 22;     int * pN = const_cast<int*>(&N);     *pN = 33;     cout << N << '\t' << &N << endl;     cout << *pN << '\t' << pN << endl;}輸出量22 0x22ff7433 0x22ff74為什么同一地址有兩個不同的值?
查看完整描述

3 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

為什么同一地址有兩個不同的數據?

沒有,編譯器可以優化對Const的任何提及,就像您已經在其中編寫了它的編譯時值一樣。

注意,編譯器還可以生成代碼,以便在運行硬盤時擦除硬盤,如果您做了一些令人討厭的操作,比如將內存寫入為Const保留的內存。


查看完整回答
反對 回復 2019-07-03
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

您會在行中得到未定義的行為。*pN = 33;,因為您正在修改Const值。任何事都可能發生。別這么做。


不過,您的編譯器可能只是簡單地進行了優化。在隊伍中:

cout << N << '\t' << &N << endl;

它知道N是一個值為22的常量表達式,因此只需將該行更改為:

cout << 22 << '\t' << &N << endl;

在下一行中,在N,你“設定”為33。(但實際上,您所做的只是刪除了對程序狀態的任何保證。)


查看完整回答
反對 回復 2019-07-03
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

通過聲明N康斯特,你答應過不會修改它的。然后你去修改它。這打破了編譯器所做的假設之一,因此程序的行為不正確。

這被稱為“未定義的行為”-在違反了語言中的假設之后,程序的行為是完全地沒有定義。它不需要產生那樣的產出-它可以產生33對雙方來說,或42,或者撞壞,或者擦除你的硬盤,或者通過你的鼻腔召喚惡魔。所以,不要修改Const值:)


查看完整回答
反對 回復 2019-07-03
  • 3 回答
  • 0 關注
  • 636 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號