先對C語言中的const和C 中的const進行講解,前者const修飾的變數不是真的常數,它只是告訴編譯器該變數不能出現在賦值符號的左邊。後者C 在C的基礎上對const進行了進化處理。
const
:#const
修飾的變數是唯讀的,本質還是變數
const
修飾的局部變數在堆疊上分配空間
const
修飾的全域變數在唯讀儲存區分配空間
const
只在編譯期間有用,在執行期間無效
const
無法定義真正意義上的常數
const
修飾的變數不是真的常數,它只是告訴編譯器該變數不能出現在賦值符號的左邊。 const
局部變數是在堆疊上分配空間,可以透過指標改變這個空間裡面的值。過了編譯期,const
變數的常數特性,只讀特性就沒有了,只讀特性只在編譯期有效,運行期根本無效。 const
修飾的全域變數在唯讀儲存區分配空間,因此如果用指標去修改了const
修飾的全域變量,程式就會崩潰,因為修改了程式唯讀存儲區中內容,大部分程式都會發生崩潰。
const
:C 在C的基礎上對const
進行了演化處理,具體表現在:
const
宣告時,在符號表中放入常數
#編譯過程中發現常數直接以符號表中的值替換(常數折疊)
編譯過程中也可能為對應的常數分配儲存空間:
const
用在全域或使用了static
關鍵字說明,存放在只讀資料區
extern const int i = 10; static const int i = 10; // 或者修饰全局变量 const int a =10; int main() {}
局部變數中對const
常數使用了&
操作符,在堆疊區分配空間
#注意:C 編譯器雖然可能為const
常數分配空間,但不會使用其儲存空間中的值符號表是編譯過程中產生的一種資料結構
#include <iostream> #include <string> using namespace std; const int i = 10; // 如果通过指针去改变i,就会出现段错误:尝试修改只读数据区数据 int main() { const int a = 5; int *p = (int *)&a; // &a, 给a标识符分配空间了,并用p指向了该空间, // 可以通过*p访问这个地址,但是不能通过a来访问 *p = 10; // 不能通过指针去改变a的值 cout << a << endl; cout << *p << endl; return 0; }
#C中的const
常數類似巨集定義
const int c = 5; // 类似于 #define c 5
但是cosnt
與巨集定義的差異在於:
const
常數是有編譯器處理
編譯器對cosnt
常數進行類型檢查和作用域檢查
巨集定義由預處理器處理,只是進行單純的文字替換
#include <stdio.h> void f() { #define a 3 const int b = 4; } void g() { printf("a = %d\n", a); // 在g函数中访问f函数中的宏定义,完全没有问题 // 在预处理的时候就进行了宏替换,对编译器来说,就是printf("a = %d\n", 3); // 宏是没有作用域的概念 // const 定义的常量,被编译器处理,是有作用域的,不能访问b printf("b = %d\n", b); } int main() { const int A = 1; const int B = 2; int array[A + B] = {0}; /* C编译 const修饰得到的只是具有只读特性的变量,数组的大小是由两个变量的大小决定的, 两个变量相加的结果需要在运行的时候才能直到,因此编译器编译的时候不知道这个数组长度,直接报错 */ /* C++编译 const是定义的真正意义上的常量,直接从符号表中取值,编译的时候就知道A和B的值, 可以得到数组的长度,不会报错 */ int i = 0; for(i=0; i<(A + B); i++) { printf("array[%d] = %d\n", i, array[i]); } f(); g(); return 0; }
#相關文章:
相關影片:
以上是常見的C++中const常數用法分析講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!