日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编译器在处理const变量跟一般变量时的区别

發布時間:2024/4/18 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译器在处理const变量跟一般变量时的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

const變量,也就是常量,當某個變量加上const屬性的時候,表明這個變量不可修改。

?

const變量是不可寫的,那么我們對于const變量的處理只剩下讀操作了。

?

當我們讀一般的變量的時候,會先獲取該變量的地址,然后到該地址去取數據,那么對于const變量的讀操作是怎么樣的呢。

下面代碼有助于更好理解const變量:

?

#include<iostream> using namespace std;int main(){const int a=10;const int * p=&a; //讓指針p指向常量a所在的內存int * p_var=const_cast<int *>(p); //強制轉換const指針為非const*p_var=20; //往該指針所指向的內存寫20,也就是把10給覆蓋了cout<<a<<endl;cout<<(&a)<<endl;cout<<*p<<endl;cout<<(p)<<endl;cout<<*p_var<<endl;cout<<(p_var)<<endl;return 0; }

?

?

然后看看輸出結果:

10        //a ? ? ? ? ? ??
0x28ac54    //&a ? ? ? ? ? ?
20        //*p ? ? ? ? ??
0x28ac54    //p ? ? ? ? ? ? ?
20        //*p_var ? ??
0x28ac54    //p_var ? ? ? ?

輸出結果顯示&a,p,p_var 相同,不過a =10 ?, *p=*p_var=20,

一個內存地址怎么可能得到兩個不同的值?

?

看看反匯編:

4011d6: c7 44 24 04 0a 00 00 movl $0xa,0x4(%esp)

上面的就是讀取const a的值的匯編代碼,它不是從內存取數據出來,而是直接得到常數0xa,也就是把const 變量當作真正的常量處理。

?

因此可以得到的結論就是:

對于const變量,編譯器會在編譯之前做處理,在所有要讀取該const變量的地方,把該const變量替換成他一開始就制定的常量,如

const int a = 10;

int b= a ;

會在編譯之前替換const變量,變成:

const int a = 10;

int b= 10;

?

********************************************************************************************

轉自:https://blog.csdn.net/blogofshuguang/article/details/16852241

我們都知道在程序中用const,如果是變量,這表示該變量的值不能被修改,,,但是看下面一段C代碼:

注意在用C編譯,

?

[cpp] view plain copy

?

  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • ??
  • int?main()??
  • {??
  • ????const?int?a?=?10;??
  • ????int?*p=(int?*)&a;//(int?*)先把&i從const?int?*?轉化為int?*??
  • ????*p=20;??
  • ????printf("a=%d,*p=%d\n",a,*p);??
  • ????return?0;??
  • }??
  • ?

    C編譯器中給出的結果是: a = 20; *p = 20 (a的值被修改了)

    而用C++編譯上面的代碼: a = 10; *p = 20;

    ?

    為什么會醬紫呢?那就先從const在C和C++中的實現機制找答案。。。

    在C中,const修飾的變量被認為是只讀的變量,該變量肯定是在內存中有存儲空間,用指針p指向該塊內存,然后就能輕易的修改掉這塊內存對應的值;

    但是在C++中難道就不能夠修改掉內存的值嗎?。。。理想是這樣,現在是C++編譯器起作用的時候了,在編譯階段,C++編譯器會用常量10去替換程序

    中對a的引用,所以,根本就沒有改的機會嘛。.(C++中的const正常情況下是看成編譯期的常量,編譯器并不為const分配空間,只是在編譯的時候將期值保存在名字表中,并在適當的時候折合在代碼中,如果加上關鍵字extern或者取const變量地址,則編譯器就要為const分配存儲空間.)

    還有一個要注意的地方:C++編譯器只能對內置數據類型(int , float...)做常數替換,而對于像結構體\類這樣的非內置數據類型編譯器不知道怎么替換,所以就不替換,

    這就和C語言一樣了,可以通過指針修改掉cosnt的值,

    比如:

    [cpp] view plain copy

    ?

  • #include?<iostream>??
  • using?namespace?std;??
  • ??
  • class?Test??
  • {??
  • public:??
  • ????int?a;??
  • ????char?c;??
  • ????Test():a(10),c('c'){}??
  • ????~Test(){}??
  • };??
  • ??
  • int?main()??
  • {??
  • ????const?Test?t;??
  • ????cout<<"t.a="<<t.a<<endl;//?結果為10??
  • ????int*?p?=?(int?*)&t.a;??
  • ????*p=20;??
  • ????cout<<"t.a="<<t.a<<endl;//j結果為20,被修改了??
  • ????return?0;??
  • }?
  • 總結

    以上是生活随笔為你收集整理的编译器在处理const变量跟一般变量时的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。