C和C++关于const关键字的不同

const描述符可修饰全局函数吗?为什么C#有const和readonly两种常量关键字?C++成员函数为什么可以由const和非const版本?const常量的不同形式? C++可以用const修饰成员函数,表示成员函数不会修改任何类成员,这是安全的编码习惯。注意,这仅仅适用于类的成员函数,如果是形如C语言的全局函数,是不可以用const修饰。但,const可以修饰函数参数。 阅读详情

在C和C++中都有const关键字,如果用来装饰一个变量则改变量设为只读类型,且必须在声明时进行初始化,否则不能后续赋值了。

在C中常量的声明方式更为传统的方式是使用#define定义,但是在C++中这种方式已经不再被提倡了。那么是不是const定义的所谓常量和#define定义的常量在使用上一样呢?

实际上C和C++关于const关键字的处理并不相同,看下面几个例子。

一、C++中const关键字

在C++中const关键字修饰的int型变量可以当做常量来使用,这至少在使用上看不出太大区别。看下面实验。

实验一:C++中的const

如下代码:

// cpp_arr_right.cpp
#include <iostream>
using namespace std;
int main(void)
{
    const int Size = 4;
    int int_arr_1[Size] = {1,2,3,4};
    cout << "sizeof(int_arr_1) = " << sizeof(int_arr_1) << endl;
    for(int i = 0; i < Size; i++) {
        cout << "int_arr_1(" <<  i << "): " << int_arr_1[i] << endl;
    }
    int int_arr_2[Size];
    cout << "sizeof(int_arr_2) = " << sizeof(int_arr_2) << endl;
    int_arr_2[0] = 11;
    int_arr_2[1] = 12;
    int_arr_2[2] = 13;
    int_arr_2[3] = 14;
    for(int i = 0; i < Size; i++) {
        cout << "int_arr_2(" <<  i << "): " << int_arr_2[i] << endl;
    }
    char char_arr[Size] = "qwe";
    cout << "sizeof(char_arr) = " << sizeof(char_arr) << endl;
    for(int i = 0; i < Size; i++) {
        cout << "char_arr(" <<  i << "): " << char_arr[i] << endl;
    }
    printf("use cout: ");
    cout << char_arr << endl;

    return 0;
}

将这个程序进行编译:

g++ cpp_arr_right.cpp -o cpp_arr_right.exe

将没有任何回显:

然后执行,得到如下信息:

这完全符合我们的预期。

二、C中const关键字

看如下的实验。

实验二:C中使用const声明数组——方式一

看如下代码:

/* c_arr_right.c */
#include <stdio.h>
int main(void)
{
    const int Size = 4;
    int int_arr[Size];
    printf("sizeof(int_arr) = %zu\n", sizeof(int_arr));
    int_arr[0] = 13;
    int_arr[1] = 15;
    int_arr[2] = 17;
    int_arr[3] = 18;
    for(int i = 0; i < Size; i++) {
        printf("int_arr[%d] = %d\n", i, int_arr[i]);
    }

    char char_arr[Size];
    printf("sizeof(char_arr) = %zu\n", sizeof(char_arr));
    char_arr[0] = 'a';
    char_arr[1] = 'c';
    char_arr[2] = 'e';
    char_arr[3] = '\0';
    for(int i = 0; i < Size; i++) {
        printf("char_arr[%d] = %c\n", i, char_arr[i]);
    }
    printf("use puts: ");
    puts(char_arr);

    return 0;
}

编译:

gcc c_arr_right.c -o c_arr_right.exe

同样没有任何回显,编译顺利通过,指向后,显示:

这同样完全符合预期。这种用法是正确的。

但是。

实验三:C中使用const声明数组——方式二

如下代码:

/* c_arr_error1.c */
#include <stdio.h>
int main(void)
{
    const int Size = 4;
    int int_arr[Size] = {1,2,3,4};

    return 0;
}

编译将得到错误报告,如下:

数组大小为变动的不能初始化。

三、C语言编程数组

这个实际上是将int_arr数组看做编程数组,变长数组是C99引入的标准。这里声明时变动的长度只要是自动存储类就可以。如下实验。

实验三:C的变长数组

代码如下:

/* vla.c */
#include <stdio.h>
int main(void)
{
    int Size = 4; // 注意,没有const修饰
    int int_arr[Size];
    printf("sizeof(int_arr) = %zu\n", sizeof(int_arr));
    int_arr[0] = 13;
    int_arr[1] = 15;
    int_arr[2] = 17;
    int_arr[3] = 18;
    for(int i = 0; i < Size; i++) {
        printf("int_arr[%d] = %d\n", i, int_arr[i]);
    }

    char char_arr[Size];
    printf("sizeof(char_arr) = %zu\n", sizeof(char_arr));
    char_arr[0] = 'a';
    char_arr[1] = 'c';
    char_arr[2] = 'e';
    char_arr[3] = '\0';
    for(int i = 0; i < Size; i++) {
        printf("char_arr[%d] = %c\n", i, char_arr[i]);
    }
    printf("use puts: ");
    puts(char_arr);

    return 0;
}

编译一样会顺利通过,并得到预期的值。

这里的Size虽然没有const修饰了,仍然可以声明一个数组,但是依然不允许进行初始化。

所谓变长数组是指数组的维数可以由变量来指定,但是一旦确定便不可以更改为了。

实验四:变长数组维数不变

/* vla_2.c */
#include <stdio.h>
int main(void)
{
    int Size = 4; // 注意,没有const修饰
    int int_arr[Size];
    Size = 6;
    printf("sizeof(int_arr) = %zu\n", sizeof(int_arr));
    char char_arr[Size];
    Size = 7;
    printf("sizeof(char_arr) = %zu\n", sizeof(char_arr));

    return 0;
}

编译运行,输出为:

可见Size在声明数组使用后,其再发生变化,便不会影响数组的原始声明维数了。

四、总结

1、C中,声明数组时,可以采用变长数组,但是声明后其长度便固定了,且声明时不允许初始化;

2、在C++中,声明数组可以使用变量,但是可以初始化;

3、虽然C和C++中声明变长数组,其用于声明维数的变量可以改变,但还是建议将其设置为const类型,利于代码维护。

4、关于const变量在C和C++中的不同处理,这玩应看似简单,实则水很深,和C与C++的关系、C++的发展,已经C和C++的具体实现都有关系,有时间,给大家专门做个讨论,分析下GCC的码源。

C/C++ 中 const 关键字用法总结 首先,来看看const的基本含义。在 C/C++ 语言中,const关键字是一种修饰符。所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有只读的特点。在编译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。 所以,const修饰符的作用主要是利用编... 阅读详情

相关推荐

cadence CIS 库建立--建立自己维护的CIS数据库

遇到一个问题,在使用cadecnce的时候,就是没有自己的本地/分享的数据库。 在画原理图或者PCB的时候,如果能搭建一个自己的数据库,在局域网或者本地 就好了。出于这样的想法,做了一些探索,找到了一种可能的答案。 由于数据库编制知识的缺乏,要自己建一个数据库似乎花费的时间会比较多。 偶发奇想,如果能够改编CIS 自带的数据库 另建立副本进行维护 就能够省下不少麻烦。 先说下CIS 是个啥。网上一搜:总之CIS 是个好东西。 功能强大。 点击CIS capture 中的 Options CIS Config

qq_29776365的博客 2万+

const 在C语言和C++中的区别

1、修饰的对象不同            在C语言中,const修饰常变量;            在C++中,const修饰常量,值不可以修改。因为在预编译期的时候就将出现使用常量的地方替换成常量的值。 2、const 修饰的字符能否被编译通过             在C语言中,arr[a]就不能通过编译,因为 a 是一个变量,变量的大小需要在变量的地址中取值,而只有运行的时候才会在地...

Lily_08的博客 676

SpringCloud2025+SpringBoot3.5.0动态路由503问题排查与负载均衡依赖解析

本文详细排查了SpringCloud 2025与SpringBoot 3.5.0环境下,Spring Cloud Gateway动态路由返回503错误的根本原因。核心问题在于新版网关未默认集成负载均衡器,导致无法解析lb://服务名。通过对比静态路由与动态路由,定位到需显式引入spring-cloud-starter-loadbalancer依赖,并提供了完整的解决方案与最佳实践配置。

s3t4u的博客 503

const 在C和C++ 中的区别

const 在C和C++ 中的区别

m0_59052131的博客 1004

Vben Admin权限管理全解析:从动态菜单到按钮级控制(附代码示例)

本文全面解析Vben Admin框架的权限管理系统,从动态菜单生成到按钮级细粒度控制,提供完整的实现方案和代码示例。深入探讨基于角色-权限模型的架构设计,分享前后端协作的最佳实践,帮助开发者快速构建安全高效的企业级后台系统。

weixin_30919429的博客 485

人工智能情感分析实战:文本情绪识别

人工智能情感分析,特别是文本情绪识别,已成为理解和处理人类情感信息的重要工具。通过数据预处理、特征提取、模型训练与评估等步骤,我们可以有效地从文本数据中提取情感信息,为各种应用场景提供有价值的洞察。随着技术的不断进步和创新,情感分析的应用前景将更加广阔,为我们的生活和工作带来更多便利和机遇。

shejizuopin的博客 1095

const在c和c++中的区别

因此在输出时,可以直接输出const在全局定义的变量,而不可以输出局部定义的变量,原因是所定义的变量未初始化。并且如果const局部变量未初始化,所给初始值为随机值时,此时const定义将毫无意义,定义了一个不可改变的随机值;const不管作为全局变量还是局部变量时,默认值都为随机值,所以在c++中使用const时一定要初始化。const定义的数据被称为常变量,在C语言中更偏向于变量,而在c++中更偏向于常量。此时编译器会报错,因为const在c语言中定义的数更偏向于变量。此时编译器可以顺利通过。

weixin_70508445的博客 377

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube

本教程基于群晖的NAS设备DS423+的docker功能进行搭建,DSM版为 7.2.1-69057 Update 5。MetaTube是一个媒体服务器插件,主要用于Emby和Jellyfin媒体服务器。它的主要功能是从互联网上抓取内容并响应 JSON 数据,然后通过预安装的 MetaTube 插件请求服务器并下载相应的元数据,以与 Jellyfin/Emby 服务器配合使用。使用 MetaTube 的步骤大致如下:部署后端:首先,需要部署一个名为​ 的后端 API 服务器来抓取内容。

小小笔记大大用处 1万+

C++和C中const的区别

目录C中的constconst修饰局部变量const修饰全局变量const修饰的全局变量有外部链接属性const与指针C++中的constconst修饰普通全局变量const修饰普通局部变量const与类 const,这个词字面意思为:常数。 这就表示这是一个不可以改变是数。同时,这也是C/C++里面的一个关键字,是一个限定符,但是const在C和C++中的用法是有区别的。 由于本人水平有限,难免会有出错的地方,如果错误,还请指正! C中的const const修饰局部变量 在C语言中,const修饰局部变

weixin_61021362的博客 2329

10、犹豫双模糊TOPSIS算法:原理与实例解析

本文介绍了犹豫双模糊TOPSIS算法的基本原理与应用步骤,结合中国四家纺织公司的案例,详细解析了从构建犹豫双模糊决策矩阵、归一化处理、专家信息聚合,到确定正负理想解、计算距离与相对贴近度系数的完整决策流程。该方法有效应对决策者在评价过程中的犹豫性,适用于财务评估、项目选择等复杂多属性决策场景,具有较强的实用性和推广价值。

yhn45678901的博客 122

ZYNQ PS-PL数据交互方式总结

一,中断 二,IO方式:MIO EMIO GPIO 三,BRAM或FIFO或EMIF (1)通过BRAM实现PL/PS之间交互 PS 的配置如下图所示。使能 M_AXI_GP0 口,将 FCLK_CLK0 设为 100MHz,使能 PL 至 PS 的中断。 AXI BRAM Controller IP 核连接 PS 的 M_AXI_GP0 口和 BRAM,完成 AXI 接口至 BRAM 接口的转换。 添加BRAM,将BRAM设置为双口RAM,将PORTA与AXI B...

wangjie36的博客 1万+

const在C和C++中的区别

  在C中,const不是常量,只能说是一个不能改变的变量(注意是变量),C编译器不能把const看成看成一个编译期间的常量,因为他在内存中有分配,C编译器不知道他在编译期间的值。所以不能作为数组定义时的下标,因为它必须为常量。   在C中,const int a;是可以的,因为这只是声明一个变量,告诉编译器,我这里是声明,指明在别的地方有内存分配。但在C++中这样写是不正确的,C++中const默认是内部链接,C中默认是外部链接,为了起到和c语言一样的效果,C++需要将const修饰为extern,因为e

NIRVANA REBIRTH 488

【华为OD机试真题】45、 分糖果 | 机试真题+思路参考+代码解析(C++、Java、Py、JS)

### 🎃题目描述 >小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 >  当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。 >  小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 1290

【c++】const关键字

const 是 C/C++ 中用于修饰变量或对象,使其在逻辑上不可修改的关键字。虽然看起来简单,但在不同场景下的行为差异很大,尤其是 C 和 C++ 中的差别更容易让人混淆。

2201_75930743的博客 982

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C/C++—const关键字详解

const关键字的作用、C/C++const的区别

拥抱技术 340

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++和C语言中const关键字的区别

C++和C语言中const关键字的区别 ** 1. 内存读取的区别 先来看下面的代码 const int m = 10; int n = m; C++中的const关键字更像是编译阶段的#define。 在C语言中,编译器会先到 m 所在的内存取出一份数据,再将这份数据赋给 n;而在C++中,编译器会直接将 10 赋给 m,没有读取内存的过程,和int n = 10;的效果一样。C++ 中的常量更类似于#define命令,是一个值替换的过程,只不过#define是在预处理阶段替换,而常量是在编译阶段替换.

figting 401

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C/C++关键字const作用总结

(1)在C语言中用const去修饰一个变量,表示这个变量是只读的,不可通过显式的调用a去修改a的值,并且此时a仍然是一个变 量,不能等同于常量(不可修改的变量); (2)要注意const在声明变量时所处的位置,位置不同,在意义上可能会有很大的不同。 如果const在'*'左边,则表示指针指向的变量的值不可变; 如果const在'*'右边,则表示指针的值是不可变的; (“近水楼台先得月”)分析的时候要:先忽略类型名(编译器解析的时候也是忽略类型名),我们看co

yx20130919的博客 692

C和C++ const用法的区别

C/C++ const用法的区别 区别一:const定义的常量: const定义的常量: C语言:当修饰一个标识符的时候我们来说,这个标识符依然是一个变量,但是它具有常属性,不能被修改。即它定义的变量叫做常变量 C++: const修饰的标识符就是一个常量 下面我们通过例子来解释一下它的区别: eg1: C语言和C++中,const修饰的标识符都不能直...

qq_37941471的博客 3053

C++关键字之const

C++关键字之const C中的const C中const修饰只读变量,编译器在编译期间不知道其存储的内容。通常不为普通 const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作。 要想修改const修饰的变量的值, 可用volatile修饰。因为: 用volatile修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、...

NeverWA的博客 1万+

c/c++中const的区别

1.前言 ​ const是construct的缩写,是c/c++语言中的类型限定符,采用const修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。 ​ 但c和c++中的const本质上却有区别。

Zom_b的博客 900

const——c与c++不同

初学c++,对const有一点小小的感悟,记录下来,有不到位的地方还请各位大神指点。>   const是一个类型限制符,本质上是对变量所在的存储空间有所限制——只能读不能写,就是这个限制导致了const的各种语法特性。   在编译期间,编译器会检查是否有改变const所修饰变量的值的行为(操作,运算符的副作用等),同时将用该变量的初始值替代文件中出现该变量的地方,如果初始值为常量则直接

. 594

C和C++中const关键字的区别

C和C++中const的区别 C里面的const是只读变量,是无法在需要常量表达式的地方使用,而且也没有“不会改变”的语义,相反只是说“不会被标注了const的代码改变”,至于会不会被别的线程或者操作系统改变,就不好说了。而C++的const是严格的常量语义,是不允许用任何方式改变的。使用cast以及地址等等方式的改变在C++中明确规定是undefined behavior

fxpbupt的专栏 1452

C/C++中的核心关键字:static extern const virtual volatile等

本文摘要:文章系统梳理了C/C++核心关键字及其特性。C语言部分重点解析了static的多重用途(变量生命周期控制、文件作用域限制)、const的跨语言差异、volatile的硬件交互特性、sizeof与strlen的区别,以及extern的跨文件调用机制。C++特有部分深入探讨了virtual实现的多态原理、new/delete与malloc/free的对象构造差异、this指针的隐式特性,以及template实现的泛型编程范式。通过对比C与C++关键字的异同(如const处理方式),揭示了两种语言在内存

nbwoshi的博客 344

C和C++中const的区别

C和C++中const的区别 const是什么? const是一个C语言的关bai键字。 const 是constant的缩du写,本意是不变的,不易改变的意思。 const 在zhiC++中是用来修饰内置类型dao变量,自定义对象,成员函数,返回值,函数参数。 const关键字不能与static关键字同时使用,因为static关键字修饰静态成员函数,静态成员函数不含有this指针,即不能实例化,const成员函数必须具体到某一实例。 ↑(百度的) const修饰的是什么? const修饰的是指针所指向的内

dayidayi111的博客 239

c++与c语言中的const关键字

const关键字在c语言中是一个冒牌货,而在c++中才是真正的const, 具体原因解释如下: (1) 先说c语言中的const关键字,可以通过指针采用间接的方式修改const a的值,可以看出const在c语言中确实是冒牌货。具体看代码: void main81() { const int a; int const b; //一样 const int *c; //con...

一路向北 213

C/C++的const和static和宏

const: C和C++中从const的区别: C中的const是伪常量,不可以给数组指派内存空间,它占用内存空间可以转换成变量使用 C++中const是真常量,它可以给数组指派内存空间,如果是一个const取地址,它会生成一个临时的内存空间但是不影响之前的结果因为它在编译期就确定了值。 指向常量的指针和常量指针: 首先const修饰常量:修饰一般常量 (一般常量是指简单类型的常量),这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。也就是const int a和 int

landscape 南北——的博客 329
上一篇: C语言基本结构及编译执行
下一篇: c语言中malloc函数的一个陷阱(二级指针的使用)
金达南
博客等级 码龄3年 137粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值