>백엔드 개발 >C#.Net 튜토리얼 >C++에서 const 상수의 일반적인 사용법 분석 및 설명

C++에서 const 상수의 일반적인 사용법 분석 및 설명

php是最好的语言
php是最好的语言원래의
2018-07-27 13:46:491806검색

먼저 C 언어의 const와 C++의 const에 대해 설명하겠습니다. 전자에서 const로 수정된 변수는 단지 할당 기호의 왼쪽에 변수가 나타날 수 없다는 것을 컴파일러에 알려줄 뿐입니다. 후자의 C++는 C를 기반으로 const를 발전시켰습니다.

1. const:

    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

      C 언어 변수 const에 의해 수정된은 읽기 전용이며 본질은 여전히 ​​변수입니다
    • const에 의해 수정된 지역 변수는 공간을 할당합니다. 스택# 🎜🎜#

    const 수정된 전역 변수는 읽기 전용 저장 영역에 공간을 할당합니다

    const는 컴파일 중에만 유용하고 런타임 중에는 유효하지 않습니다.

    const는 실제 상수를 정의할 수 없습니다. # 🎜🎜#

    const에 의해 수정된 변수는 실제 상수가 아니며 단지 변수가 상수의 왼쪽에 나타날 수 없다는 것을 컴파일러에 알려줄 뿐입니다. 할당 기호. const 지역 변수는 스택에 공간을 할당하며, 이 공간의 값은 포인터를 통해 변경될 수 있습니다. 컴파일 기간이 지나면 const 변수의 상수 특성과 읽기 전용 특성은 사라집니다. 읽기 전용 특성은 컴파일 기간 동안에만 유효하며 런타임에는 영향을 미치지 않습니다. const에 의해 수정된 전역 변수는 읽기 전용 저장 영역에 공간을 할당합니다. 따라서 포인터를 사용하여 const에 의해 수정된 전역 변수를 수정하면 프로그램이 중단됩니다. 수정된 프로그램만 있기 때문에 대부분의 프로그램은 메모리 영역의 내용을 읽을 때 충돌이 발생합니다.

    #🎜🎜#2. C++의 const:#🎜🎜#C++는 C를 기반으로 const를 발전시킵니다. # 🎜🎜#
      #🎜🎜##🎜🎜# const 선언 시 심볼 테이블에 상수를 넣어주세요 #🎜🎜# #🎜🎜##🎜 🎜##🎜🎜# 컴파일 과정에서 상수가 심볼 테이블의 값으로 직접 대체되는 것을 발견했습니다(상수 폴딩) #🎜🎜##🎜🎜##🎜🎜##🎜🎜#그것도 컴파일 과정에서 가능 해당 상수에 대한 저장 공간 할당: #🎜🎜##🎜🎜#
        #🎜🎜## 🎜🎜#const는 전역적으로 사용되거나 static 키워드 설명을 사용하여 읽기 전용 데이터 영역 #🎜🎜#
        #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;
        }
        #🎜🎜##🎜🎜##에 저장됩니다. 🎜🎜# 지역 변수 & 연산자는 const 상수에 사용되어 스택 영역에 공간을 할당합니다 #🎜🎜##🎜🎜##🎜🎜##🎜🎜 #
        참고: C++ 컴파일러는 const 상수에 공간을 할당할 수 있지만 저장 공간의 값을 사용하지 않습니다.#🎜🎜#심볼 테이블은 컴파일 프로세스 중에 생성된 데이터 구조입니다. #🎜🎜#
        rrreee#🎜🎜#3. 매크로 정의와의 비교#🎜🎜#C++의 const 상수는 매크로 정의와 유사합니다#🎜🎜#rrreee #🎜🎜#그러나 cosnt 매크로 정의와의 차이점은 다음과 같습니다. #🎜🎜#
          #🎜🎜##🎜🎜#const code>상수는 컴파일러에 의해 처리됩니다# 🎜🎜##🎜🎜##🎜🎜##🎜🎜#컴파일러는 <code>cosnt 상수에 대한 유형 검사 및 범위 검사를 수행합니다#🎜🎜##🎜🎜# #🎜🎜##🎜🎜# 매크로 정의는 전처리기에 의해 처리되며 단순한 텍스트 대체입니다. #🎜🎜##🎜🎜##🎜🎜#rrreee#🎜🎜#관련 기사: #🎜🎜##🎜🎜 ##🎜🎜##🎜🎜# PHP에서 const와 정의의 차이점 분석#🎜🎜##🎜🎜##🎜🎜#관련 동영상: #🎜🎜##🎜🎜##🎜🎜#PHP 기본 분석 동영상 튜토리얼#🎜🎜##🎜🎜#

위 내용은 C++에서 const 상수의 일반적인 사용법 분석 및 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.