まず、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 コンパイラは ## を割り当てる場合がありますが、 #const3. マクロ定義との比較C の定数空間ですが、その記憶空間の値は使用されません
シンボルテーブルはコンパイルプロセス中に生成されるデータ構造です#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; }
const 定数はマクロ定義
const int c = 5; // 类似于 #define c 5に似ていますが、
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 中国語 Web サイトの他の関連記事を参照してください。