C++中的常量表达式

在C++中,常量表达式是指在编译期间就能计算出其值的表达式,并且该值在程序运行过程中不会改变,编译器可以在编译时就确定它的值。并且可以在需要常量

值的上下文中使用。

下面的几个例子都是常量表达式:

1.整型字面值,如10、20等,这些都是常量表达式,因为它们在编译时就已经确定了值。

2.算术表达式,只要其中的操作数都是常量表达式,整个算术表达式也是常量表达式。例如2 + 3 * 4,根据运算符优先级,先计算3 * 4 = 12,然后2+12 = 14,这

个计算过程在编译阶段就可以完成,所以它是常量表达式。

3.枚举类型的值 例如,Color::Green是一个常量表达式,它的值是2在编译时就已经确定。

enum class Color { Red, Green, Blue };
Color c = Color::Green;

4.字面值常量,用常量表达式初始化的常量对象等都是常量表达式。

字面值常量: 直接在代码中写出的常量值。它是一种基本的数据形式,用来表示固定的值。

例如:

整数字面值:如1,0,-10等

浮点数字面值:例如3.14,2.718

字符字面值:用单引号括起来的字符,如'a','0','\n'(换行符)

字符串字面值:用双引号括起来的字符序列,如"Hello","123"。

布尔字面值:true和false

常量表达式初始化的常量对象都是常量表达式的原因:这个初始化过程在编译阶段就可以完成

const int a = 10;
const int b = a + 5;

a是用常量表达式10初始化的常量对象。而b是用a + 5初始化的,因为a是常量表达式,5也是常量表达式,所以a + 5这个算术表达式在编译阶段可以计算出结果,因此b也是常量表达式。编译器可以在编译程序时就确定b的值为15,并且这个值在程序运行期间不会改变。这符合常量表达式在编译期间就能确定值且值固定不变的特点。

什么场景下使用常量表达式:

1.定义数组大小:定义数组时,数组的大小必须是一个常量表达式,因为数组在内存中的空间是在编译时就分配好的

const int N = 10;
int ptr[N];

2.作为模板参数: 模板参数可以是常量表达式。模板是一种代码生成机制,在编译时根据模板参数生成具体的代码。

例如,定义一个简单的模板函数来计算两个数的乘积:这里3和4作为常量表达式传递给模板参数num1和num2,编译器在编译时就可以根据这些参数计算出result的值为12。这种用法可以在编译时进行一些计算,提高程序运行时的效率,并且可以生成更加通用的代码。

template<int num1, int num2>
constexpr int multiply() {return num1 * num2;
}
//调用
constexpr int result = multiply<3, 4>();

3.初始化常量对象

a.基本数据类型常量对象:

#include <iostream>
using namespace std;
int main() {// 使用整数常量表达式初始化常量对象constexpr int const_int = 10; // 使用字符常量表达式初始化常量对象constexpr char const_char = 'A'; // 使用布尔常量表达式初始化常量对象constexpr bool const_bool = true; cout << "const_int: " << const_int << endl;cout << "const_char: " << const_char << endl;cout << "const_bool: " << const_bool << endl;return 0;
}

b.使用constexpr函数的结果初始化常量对象

例如下面 定义了一个constexpr函数square,它可以在编译时计算出结果。然后通过调用这个函数并将其结果作为常量表达式来初始化常量对象const_square。

#include <iostream>
using namespace std;
// constexpr函数,用于计算平方
constexpr int square(int x) {return x * x;
}
int main() 
{// 使用constexpr函数的结果作为常量表达式来初始化常量对象constexpr int s= square(5); cout << "s的值: " << s << endl;return 0;
}

4.枚举常量的初始化: 枚举类型是一种用户自定义的数据类型,用于定义一组命名的常量。在初始化枚举常量时,可以使用常量表达式。

例如,定义一个表示颜色的枚举类型:这里RED、GREEN和BLUE的初始值是常量表达式(0,1和2)。这种用法可以让枚举常量在编译时就有确定的值,方便在程序中进行比较和使用。

enum class Color {RED = 0,GREEN = 1,BLUE = 2 * 1
};

5.开关语句(switch)中的常量表达式

在switch语句中,case标签后面的值必须是常量表达式。这是为了让编译器在编译时就能确定跳转的目标位置。

int main() {int choice = 2;switch (choice) {case 1:cout << "星期一" << endl;break;case 2:cout << "星期二" << endl;break;default:cout << "未定义" << endl;break;}return 0;
}

如何判断一个表达式是否是常量表达式

1.常量和字面量

像整数常量(如42),字符常量(如'A'),字符串字面量(如"Hello")等都是常量表达式。这些值在编译时就已经确定,并且不会改变。

2.用const修饰的变量且有初始值

如果一个变量被const修饰,并且它的初始值是一个常量表达式,那么这个变量也可以看作是常量表达式。

例如:这里a在编译时就被初始化为5,并且后续不能被修改,所以它是常量表达式。

const int a = 5;  // 'a'是常量表达式

注意,如果const变量没有初始值,或者初始值不是常量表达式,那么它不是常量表达式。例如:

const int b;  //不是常量表达式,没有初始值
int c = 3;
const int d = c;  // 不是常量表达式,初始值依赖于运行时的值(因为赋值运算在运行时才能实现)

3. constexpr 关键字

可以使用constexpr关键字来声明一个函数或者变量是常量表达式。对于函数它要求函数体足够简单,能够在编译时计算出结果。

例如:这个square函数是一个常量表达式函数,因为它的计算逻辑简单,编译器可以在编译阶段计算出square函数的结果。

constexpr int square(int x) {return x * x;
}
int main() {constexpr int result = square(3);  // 可以在编译时计算出square(3)的值为9return 0;
}

对于变量,constexpr变量必须用常量表达式初始化。

constexpr int e = 2 + 3;  // 'e'是常量表达式,初始值是常量表达式'2 + 3'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18659.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Go】-bufio库解读

目录 Reader和Writer接口 bufio.Reader/Writer 小结 其他函数-Peek、fill Reader小结 Writer Scanner结构体 缓冲区对于网络数据读写的重要性 Reader和Writer接口 在net/http包生成的Conn 接口的实例中有两个方法叫做Read和Write接口 type Conn interface {Read(b []b…

mac 0S中虚拟机分辨率高怎么办

在VMware Fusion安装的Windows虚拟机有时候会遇到下图的问题&#xff0c;分辨率很高、桌面和任务栏的图标都很小&#xff0c;没办法正常使用。 解决方法&#xff1a; 点击工具栏中的扳手图标&#xff0c;打开设置。 打开系统设置中的“显示器”。 取消勾选“使用Retina全分辨率…

找不到d3dx9_43.dll怎么解决,d3dx9_43.dll缺失的七种解决方法

​在计算机游戏领域&#xff0c;遇到“找不到d3dx9_43.dll”错误信息是一个相当普遍的现象。这一问题不仅影响玩家的游戏体验&#xff0c;还可能导致游戏无法启动或运行不稳定。本文旨在深入解析这一问题的原因&#xff0c;并提供有效的解决方法&#xff0c;帮助广大游戏玩家轻…

论文《基于现实迷宫地形的电脑鼠设计》深度分析(四)——现实迷宫算法

论文概述 《基于现实迷宫地形的电脑鼠设计 》是由吴润强、庹忠曜、刘文杰、项璟晨、孙科学等人于2023年发表的一篇优秀期刊论文。其针对现阶段电脑鼠计算量庞大且不适用于现实迷宫地形的问题&#xff0c;特基于超声波测距与传统迷宫算法原理&#xff0c;设计出一款可在现实…

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…

Iview DatePicker 仅允许选择当前月份及以后的月份

iview DatePicker之前月份禁用且下月可用 html代码 <DatePicker type"month" :options"options4" :value"dialogForm.estimatedStartTimeWithCreate" on-change"monthTime($event, loadDateStart)" placeholder"请选择时间&q…

Redis 内存管理

参考&#xff1a;面试官&#xff1a;为什么 Redis 不立刻删除已经过期的数据&#xff1f; 目录 1.Redis 给缓存数据设置过期时间有什么用&#xff1f; 2.Redis 是如何判断数据是否过期的呢&#xff1f; 3.Redis 过期 key 删除策略了解么&#xff1f; 4.大量 key 集中过期怎…

【IC每日一题:SVA简介】

IC每日一题&#xff1a;SVA简介 1 断言概念1.1 断言优势&#xff1b;1.2 断言类型1.2.1 立即断言1.2.2 并行断言1.2.3 并发断言Demo 2 SVA语法2.1 蕴含操作符&#xff1a;|-> 和 ->2.1.1 蕴含操作符 |>2.1.2 蕴含操作符|-> 2.2 延时操作符2.2.1 ##n 操作符 2.3 重复…

深度学习之One Stage目标检测算法2

我们将对单次目标检测器&#xff08;包括SSD系列和YOLO系列等算法&#xff09;进行综述。我们将分析FPN以理解多尺度特征图如何提高准确率&#xff0c;特别是小目标的检测&#xff0c;其在单次检测器中的检测效果通常很差。然后我们将分析Focal loss和RetinaNet&#xff0c;看看…

【MySQL】优化方向+表连接

目录 数据库表连接 表的关系与外键 数据库设计 规范化 反规范化 事务一致性 表优化 索引优化 表结构优化 查询优化 数据库表连接 表的关系与外键 表之间的关系 常见表关系总结 一对一关系&#xff1a;每一条记录在表A中对应表B的唯一一条记录&#xff0c;反之也是&a…

SHELL笔记(概念+变量)

shell 概念 Shell 是一个命令行解释器&#xff0c;它充当用户与操作系统内核之间的桥梁。用户在 Shell 环境下输入各种命令&#xff0c;Shell 负责接收并分析这些命令&#xff0c;然后将其转换为内核能够理解和执行的系统调用。通过这种方式&#xff0c;用户可以便捷地操作计算…

统信UOS开发环境支持Golang

UOS为Golang开发者提供了各种编辑器和工具链的支持,助力开发者实现高质量应用的开发。 文章目录 一、环境部署Golang开发环境安装二、代码示例Golang开发案例三、常见问题1. 包导入错误2. 系统资源限制一、环境部署 Golang开发环境安装 golang开发环境安装步骤如下: 1)安装…

web前端开发--盒子属性

1、设置背景图像固定 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>设置背景图像固定</title><style type"text/css">/*p{background-attachment: scroll;/*fixed固定*//*随元素滚动还是固定*/}&…

Python数据分析NumPy和pandas(三十五、时间序列数据基础)

时间序列数据是许多不同领域的结构化数据的重要形式&#xff0c;例如金融、经济、生态学、神经科学和物理学。在许多时间点重复记录的任何内容都会形成一个时间序列。许多时间序列是固定频率的&#xff0c;也就是说&#xff0c;数据点根据某些规则定期出现&#xff0c;例如每 1…

前端开发之打印功的使用和实例(vue-print-nb)

通过插件来进行实现 前言效果图1、安装插件vue2vue32、 引入Vue项目2、 使用2.1、在项目中创建按钮并且使用v-print绑定绑定打印事件2.2、编写要打印的内容,给内容附加唯一的id2.3、绑定的时间的方法和参数3、整体代码(此代码是通过vue3来进行实现的但是逻辑都是一样的)前言…

使用Web Animations API实现复杂的网页动画效果

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂…

分享一个mysql-sql优化经验 in (xxx)的优化【 in(集合)改成not in(反集合) 】

一、优化前 如下sql&#xff0c;直接执行时间需要18.341秒 二、优化后 将 in(集合) 改成 not in(反集合)&#xff0c;如下图&#xff0c;执行性能提升至少4倍&#xff0c;需要4.643秒&#xff0c;并且查询结果不变 三、原因分析 为什么速度会变快那么多&#xff1f; in (集…

传感器页面、屏幕刷新任务学习

一、user_SensorPageTask 传感器页任务 ​ /* Private includes -----------------------------------------------------------*/ //includes #include "user_TasksInit.h" #include "user_ScrRenewTask.h" #include "user_SensorPageTask.h" …

BigQuery中jobUser和dataViewer的角色有什么不同

真题实战 Scenario: Your company utilizes BigQuery as the enterprise data warehouse, with data spread across multiple Google Cloud projects. Queries on BigQuery must be billed to a specific project, separate from where the data resides. Users should have q…

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦&#xff0c;主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以&#xff0c;我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉&#xff0c;也不熟悉 Cocoa 框架&#xff0c;在 ChatGPT…