Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse und Erklärung der allgemeinen Verwendung von const-Konstanten in C++

Analyse und Erklärung der allgemeinen Verwendung von const-Konstanten in C++

php是最好的语言
php是最好的语言Original
2018-07-27 13:46:491718Durchsuche

Erklären Sie zunächst die Variable const in C und die Variable const in C++, die keine echte Konstante ist. Sie teilt dem Compiler lediglich mit, dass die Variable nicht auf der linken Seite des Zuweisungssymbols erscheinen kann. Letzteres C++ entwickelt const auf Basis von C weiter.

1. const in C-Sprache:

  • const Die geänderte Variable ist schreibgeschützt und das Wesentliche ist immer noch eine Variable

  • constDie geänderten lokalen Variablen reservieren Speicherplatz auf dem Stapel

  • constDie geänderten globalen Variablen reservieren Speicherplatz im schreibgeschützten Speicherbereich

  • const ist nur zur Kompilierungszeit nützlich, nicht zur Laufzeit gültig

  • constKann keine echten Konstanten definieren

constDie geänderte Variable ist keine echte Konstante, sie teilt dem Compiler lediglich mit, dass die Variable nicht auf der linken Seite des Zuweisungssymbols erscheinen darf. const Lokale Variablen weisen Speicherplatz auf dem Stapel zu, und der Wert in diesem Speicherplatz kann über einen Zeiger geändert werden. Nach dem Kompilierungszeitraum sind die konstanten Eigenschaften und schreibgeschützten Eigenschaften von const-Variablen nicht mehr gültig. Die schreibgeschützten Eigenschaften sind nur während des Kompilierungszeitraums gültig und haben zur Laufzeit keine Auswirkung. Die durch const geänderte globale Variable weist Platz im schreibgeschützten Speicherbereich zu. Wenn daher ein Zeiger zum Ändern der durch const geänderten globalen Variablen verwendet wird, stürzt das Programm ab, da der Inhalt des Programms schreibgeschützt ist Wenn der Speicherbereich geändert wird, wird dies bei den meisten Programmen der Fall sein. Es ist ein Absturz aufgetreten.

2. const in C++:

C++ hat sich const auf der Basis von C entwickelt, wie gezeigt in:

  • constPlatzieren Sie bei der Deklaration Konstanten in der Symboltabelle

  • Während des Kompilierungsprozesses wird festgestellt, dass die Konstanten direkt durch Werte in der Symboltabelle ersetzt werden (Konstantenfaltung)

  • Es ist auch möglich, während des Kompilierungsprozesses Speicherplatz für die entsprechenden Konstanten zuzuweisen:

    • const wird global verwendet oder die Die Beschreibung des Schlüsselworts static wird verwendet und im schreibgeschützten Datenbereich

      extern const int i = 10;
      static const int i = 10;
      
      // 或者修饰全局变量
      const int a =10;
      int main()
      {}
    • gespeichert. Lokale Variablen verwenden den Operator const für die Konstante & und weisen Platz im Stapel zu Bereich

Hinweis: Obwohl der C++-Compiler möglicherweise Speicherplatz für const Konstanten zuweist, verwendet er den Wert in seinem Speicherplatz nicht.

Die Symboltabelle ist ein Datenwert Struktur, die während des Kompilierungsprozesses generiert wird

#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. Vergleich mit der Makrodefinition

Die const-Konstante in C++ ähnelt der Makrodefinition

const int c = 5;
// 类似于
#define c 5

, aber die Der Unterschied zwischen cosnt und der Makrodefinition ist:

  • constKonstanten werden vom Compiler verarbeitet

  • Der Compiler führt Typprüfung und Gültigkeitsbereich durch Überprüfen von cosnt-Konstanten

  • Die Makrodefinition wird vom Präprozessor verarbeitet und ist nur eine einfache Textersetzung

#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;
}

Verwandte Artikel:

const in PHP Analyse des Unterschieds mit define

Verwandte Videos:

Video-Tutorial zur zugrunde liegenden PHP-Analyse

Das obige ist der detaillierte Inhalt vonAnalyse und Erklärung der allgemeinen Verwendung von const-Konstanten in C++. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn