目錄限定符const
是老生常談的話題了,不管是面試還是平時工作都會經常遇到,你真的對它了解了麼?我這裡主要是從三個維度進行總結,並進行例項驗證。
const修飾內建型別:
// 以下兩種表達是等價的
const int a = 0;
int const b = 1;
a = 1; // 不允許,編譯報錯
b = 2; // 不允許,編譯報錯
const修飾指標
int age = 1;
const int *p = &age; // 不能使用p修改其指向的記憶體,*p是常量
int* const q = &age; // 不能改變指標指向的位置,q是常量
int sage = 2;
p = &sage; // 允許
*p = 3; // 不允許
*q = 4; // 允許
q = &sage // 不允許
const修飾函式
int f() const {} // 表示該函式函式不能修改成員變數的值(針對類)
const int f() {} // 表示該函式的返回值,沒什麼意義,函式返回值是匿名臨時變數,函式呼叫完成會銷毀,所以本質上沒有什麼作用
const修飾全域性變數
#include using namespace std;
const int a = 0;
int main()
彙編**如下:
a.out: file format mach-o 64-bit x86-64
disassembly of section __text,__text:
0000000100000fb0 _main:
100000fb0: 55 pushq %rbp
100000fb1: 48 89 e5 movq %rsp, %rbp
100000fb4: 31 c0 xorl %eax, %eax
100000fb6: 5d popq %rbp
100000fb7: c3 retq
contents of section __text:
100000fb0 554889e5 31c05dc3 uh..1.].
contents of section __unwind_info:
100000fb8 01000000 1c000000 00000000 1c000000 ................
100000fc8 00000000 1c000000 02000000 b00f0000 ................
100000fd8 34000000 34000000 b90f0000 00000000 4...4...........
100000fe8 34000000 03000000 0c000100 10000100 4...............
100000ff8 00000000 00000001 ........
extern修飾const全域性變數
#include using namespace std;
extern const int a = 888;
int main()
彙編**如下:
a.out: file format mach-o 64-bit x86-64
disassembly of section __text,__text:
0000000100000fa0 _main:
100000fa0: 55 pushq %rbp
100000fa1: 48 89 e5 movq %rsp, %rbp
100000fa4: 31 c0 xorl %eax, %eax
100000fa6: 5d popq %rbp
100000fa7: c3 retq
contents of section __text:
100000fa0 554889e5 31c05dc3 uh..1.].
// 區別在這,常量區,100000fa8是記憶體位址,78030000是字面值888
contents of section __const:
100000fa8 78030000 x...
contents of section __unwind_info:
100000fac 01000000 1c000000 00000000 1c000000 ................
100000fbc 00000000 1c000000 02000000 a00f0000 ................
100000fcc 34000000 34000000 a90f0000 00000000 4...4...........
100000fdc 34000000 03000000 0c000100 10000100 4...............
100000fec 00000000 00000001 ........
const修飾區域性變數
#include using namespace std;
int main()
彙編**如下:
a.out: file format mach-o 64-bit x86-64
disassembly of section __text,__text:
0000000100000fa0 _main:
100000fa0: 55 pushq %rbp
100000fa1: 48 89 e5 movq %rsp, %rbp
100000fa4: 31 c0 xorl %eax, %eax
// 區別在這,區域性變數是分配了記憶體的,將0賦值給棧中的變數(占用棧空間)
100000fa6: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)
100000fad: 5d popq %rbp
100000fae: c3 retq
contents of section __text:
100000fa0 554889e5 31c0c745 fc000000 005dc3 uh..1..e.....].
contents of section __unwind_info:
100000fb0 01000000 1c000000 00000000 1c000000 ................
100000fc0 00000000 1c000000 02000000 a00f0000 ................
100000fd0 34000000 34000000 b00f0000 00000000 4...4...........
100000fe0 34000000 03000000 0c000100 10000100 4...............
100000ff0 00000000 00000001 ........
關於這個問題,之前沒有了解過,查詢書籍沒有得到比較滿意的答覆,這裡借用這個小哥哥的博文,自己感覺寫的挺好的,學習一下,後續再驗證。詳情點我 C語言關於const的那點事兒
const應該是單詞constant的縮寫,意思是永恆的不變的。const這個關鍵字用得到的地方很多,用的方式也很多,因此讓人疑惑的地方也比較多,今天做個總結。const int a int const a 都是把a常量化了,告訴大家不要修改a的值,如果你非要修改a的值 const int a 10...
C 的那點事兒
一 預處理 定義 在編譯之前所做的處理,主要包括 標頭檔案 預處理會展開 巨集定義 預處理會替換掉 條件編譯 二 標頭檔案 作用 將一些公用 如函式原型宣告,型別宣告,全域性變數宣告,巨集定義等,放到乙個檔案中,以提供跨工程 復用,減少 重複書寫。處理方式 內容展開 若標頭檔案中有遞迴包含逐級展開 ...
游標那點事兒
兩種迴圈跳出方法 1 稍顯複雜點 create procedure dbo.usp cralltables client id varchar 256 asdeclare table name varchar 50 set nocount on declare t name cur cursor l...