ホームページ  >  記事  >  バックエンド開発  >  C++ における const 定数の一般的な使用法の分析と説明

C++ における const 定数の一般的な使用法の分析と説明

php是最好的语言
php是最好的语言オリジナル
2018-07-27 13:46:491775ブラウズ

まず、C 言語の const と C 言語の const について説明します。前者の const で変更される変数は実際の定数ではなく、その変数を代入記号の左側に置くことができないことをコンパイラに伝えるだけです。後者の C は、C に基づいて const を進化させます。

1. C 言語の const:

  • const 変更された変数は読み取り専用であり、本質的には変数のままです.

  • const変更されたローカル変数はスタック上にスペースを割り当てます

  • const変更されたグローバル変数変数は読み取り専用ストレージ領域にスペースを割り当てます。

  • const はコンパイル中にのみ有用で、実行時には無効です。

  • ##const実定数を定義できません

const変更された変数は実定数ではありません。変更された変数は実定数ではないことをコンパイラに伝えるだけです。割り当て記号の左側に表示されます。 const ローカル変数はスタック上にスペースを割り当て、このスペースの値はポインタを通じて変更できます。コンパイル期間が経過すると、const 変数の定数特性と読み取り専用特性は失われます。読み取り専用特性はコンパイル期間中にのみ有効であり、実行時には影響しません。 const によって変更されたグローバル変数は、読み取り専用の記憶域にスペースを割り当てます。したがって、const によって変更されたグローバル変数をポインタを使用して変更すると、読み取りが行われるため、プログラムがクラッシュします。 -プログラムのストレージのみが変更されており、この領域のコンテンツが存在すると、ほとんどのプログラムがクラッシュします。

2. C の 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;
}
3. マクロ定義との比較

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;
    }
  • 関連記事:


PHP での const と定義 差分分析

関連ビデオ:

PHP 基礎分析ビデオ チュートリアル

以上がC++ における const 定数の一般的な使用法の分析と説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。