const的用法

news/2024/7/3 3:48:21

目录

const的基本理解

C和C++中const的区别

代码段 

不初始化or初始化

常变量or常量

编译方式


备注开发环境:vscode通过ssh连接虚拟机中的ubuntu,ubuntu-20.04.3-desktop-amd64.iso

const的基本理解

const修饰的变量不能作为左值

const修饰的变量初始化完成后,值不能被修改

C和C++中const的区别

在C中,可以不初始化const修饰的量;在C++中,必须初始化const修饰的量

C和C++对于const的编译方式不同

在C中,将const修饰的量当作变量来编译,const修饰的量称为常变量

在C++中,const修饰的量有如下两种情况:

1、const修饰的量被初始化成一个立即数,称为常量

对于这种情况,在编译时,const常量的名字都被替换成常量的初始化值

2、const修饰的量被初始化成一个变量,称为常变量

代码段 

不初始化or初始化

// 文件命名为const.c
// 使用gcc const.c -o const_c可以通过编译
// 以下代码用于演示在C中可以不初始化const修饰的量

#include<stdio.h>

void main()
{
    const int a;
    // 在C中可以不初始化const修饰的量
}
// 文件命名为const.cpp
// 使用g++ const.cpp -o const_cpp未能通过编译
// 以下代码用于演示在C++中必须初始化const修饰的量

#include<iostream>

int main()
{
    const int a;
    // 在C++中必须初始化const修饰的量
    // 此处未初始化,导致未能通过编译
    
    return 0;
}

/*
const.cpp: In function ‘int main()’:
const.cpp:9:15: error: uninitialized const ‘a’ [-fpermissive]
    9 |     const int a;
      |               ^
*/

常变量or常量

// 文件命名为const.c
// 使用gcc const.c -o const_c未能通过编译

#include<stdio.h>

void main()
{
    const int a = 20;

    int A[a] = { };
    // 此处是错误的用法
    // 在C中,将const修饰的量当作变量来编译,const修饰的量称为常变量
    // C语言标准要求数组的大小必须是一个常量表达式,数组的大小必须在编译时就能确定
    // a虽然被声明为const int类型,但是它在运行时才被初始化为20
    // 因此,a不是一个常量表达式,而是一个常变量,不能用作数组的大小
}

/*
const.c: In function ‘main’:
const.c:10:5: error: variable-sized object may not be initialized
   10 |     int A[a] = { };
      |     ^~~
*/
// 文件命名为const.cpp
// 使用g++ const.cpp -o const_cpp可以通过编译

#include<iostream>

int main()
{
    const int a = 20;

    int A[a] = { };
    // 此处是正确的用法
    // 在C++中,const修饰的量被初始化成一个立即数,称为常量
    // 对于这种情况,在编译时,const常量的名字都被替换成常量的初始化值
    // 所以数组的大小在编译时就能确定
    
    return 0;
}
// 文件命名为const.cpp
// 使用g++ const.cpp -o const_cpp可以通过编译

#include<iostream>

int main()
{
    int b = 20;
    const int a = b;

    int A[a] = { };
    // 此处是不规范的用法,不建议这样使用
    // 在C++中,const修饰的量被初始化成一个变量,称为常变量
    // 这种情况与“在C中,将const修饰的量当作变量来编译,const修饰的量称为常变量”类似

    // C++标准中,并没有直接支持在数组大小中使用运行时的非常量表达式
    // 根据C++标准,在定义数组时,数组的大小必须是一个常量表达式,即在编译时就能确定的值

    // 那为什么可以通过编译呢?比较合理的解释应该是:
    // 编译器对变长数组提供了一种扩展特性,允许变长数组的大小在运行时确定
    // 需要注意的是,变长数组只在支持该特性的编译器中可用
    // 变长数组(Variable Length Array,VLA)
    
    return 0;
}

编译方式

// 文件命名为const.c

#include<stdio.h>

void main()
{
    const int a = 2;

    int * p = (int *)&a;
    *p = 99;
    // a由const修饰,a不能作为左值
    // a的内存中的值仍然可以被修改

    printf("%d %d %d\n", a, *p, *(&a));
    // 在C中,将const修饰的量当作变量来编译
    // 最终输出结果为99 99 99
}
// 文件命名为const.cpp

#include<iostream>

int main()
{
    const int a = 2;

    int * p = (int *)&a;
    *p = 99;
    // a由const修饰,a不能作为左值
    // a的内存中的值仍然可以被修改

    printf("%d %d %d\n", a, *p, *(&a));
    // 在C++中,const修饰的量被初始化成一个立即数,称为常量
    // 对于这种情况,在编译时,const常量的名字都被替换成常量的初始化值
    // 最终输出的结果会因编译器和操作系统的不同而有所差异
    // Windows 10下,在Dev C++中选用TDM-GCC 4.9.2 64-bit Debug,输出2 99 2
    // ubuntu-20.04.3-desktop-amd64.iso下,输出2 99 99

    return 0;
}

http://lihuaxi.xjx100.cn/news/1386460.html

相关文章

信息安全战线左移!智能网联汽车安全亟需“治未病”

当汽车由典型的工业机械产品逐步发展成为全新的智能移动终端&#xff0c;汽车的安全边界发生了根本性改变&#xff0c;信息安全风险和挑战不断增加。 面对复杂的异构网络、异构系统及车规级特异性要求&#xff0c;智能智能网联汽车信息安全到底要如何防护&#xff0c;已经成为…

kotlin学习和常用知识

目录 一、Kotlin 详解二、Kotlin 发展历史三、Kotlin 的特性四、案列 Kotlin 是一种由 JetBrains 公司开发的静态类型编程语言&#xff0c;旨在为 Java 开发者提供一种更加安全、简洁、易于使用的编程语言。Kotlin 可以编译成 Java 字节码&#xff0c;因此可以在 Java 虚拟机&a…

k8s集群安装v1.20.9

参考网上资料并将异常问题解决&#xff0c;经测试可正常安装集群。 1.我的环境准备 本人使用vmware pro 17新建三个centos7虚拟机&#xff0c;每个2cpu&#xff0c;20GB磁盘存储&#xff0c;内存2GB&#xff0c;其中主节点的内存3GB&#xff0c;可使用外网. 2.所有节点安装D…

IFIX5.8安装教程

管理员身份运行&#xff1a; 安装&#xff1a; 下次安装的时候选择SCADA服务器&#xff0c;独立。然后下图就不会出现了。 重启电脑&#xff1a;

有哪些好用的思维导图软件?这几款软件很好用

有哪些好用的思维导图软件&#xff1f;思维导图软件是一类专门用于制作和管理思维导图的工具软件。它能够帮助用户将复杂的思维过程、信息和知识进行有机的组织和整理&#xff0c;从而达到更好的思维和工作效果。下面就给大家介绍几种好用的思维导图绘制软件。 第一种软件&…

8款常见的自动化测试开源框架

在如今开源的时代&#xff0c;我们就不要再闭门造车了&#xff0c;热烈的拥抱开源吧&#xff01;本文针对性能测试、Web UI 测试、API 测试、数据库测试、接口测试、单元测试等方面&#xff0c;为大家整理了github或码云上优秀的自动化测试开源项目&#xff0c;希望能给大家带来…

【SA8295P 源码分析】55 - ifs2_la.img 镜像加载解析过程分析

【SA8295P 源码分析】55 - ifs2_la.img 镜像加载解析过程分析 一、startupmgr 可执行程序分析1. startupmgr\src\script.c 入口 main 函数:调用 init_loader_and_launcher 解析 scripts 数组二、ifsloader镜像加载流程分析:2.1 init_loader_and_launcher() :初始化rlimit rl…

eclipse 最新版没有navigator视图如何解决

使用project exploere视图可以显示类似navigator视图 1.显示project exploere视图 window---->show view --->project exploere 2.project exploere视图转换为类似navigator视图 第一步&#xff1a;点击视图右上角三个点或者倒三角&#xff0c;点击fiters and custom…