constexpr和常量表达式

news/2024/10/7 4:31:51

1、常量表达式是什么

在编译时就能确定其值的表达式。换句话说,常量表达式的值在编译过程中就已经是已知且不会改变的。常量表达式是由 数据类型初始值 共同决定的。(注意区分const 和 常量表达式)

常量表达式的特点:

  • 值在编译时已知:常量表达式的值在编译阶段就能确定,而不是在运行时。
  • 不会改变:常量表达式的值一旦确定,就不会再改变。
  • 不包含函数调用:除了几个特定的内置函数(如sizeof)外,常量表达式通常-不包含函数调用,因为函数调用可能会在运行时产生不同的结果。
  • 通常用于初始化常量:常量表达式常用于初始化常量,如数组的大小、枚举值、constexpr变量等。

以下为几个例子:

const int a1 = 10;      //a1为常量表达式
const int a2 = a1 + 10;     //a2为常量表达式
int a3 = 10;        //a3不为常量表达式,非const int类型
const int a4 = fun();   //需要运行时确定值,非编译时期

2、constexpr

constexpr是C++中的一个关键字,用于指定常量表达式。
constexpr函数是能用于常量表达式的函数,它们的返回值类型所有形参的类型都必须是字面值类型,并且函数体中必须有且只有一条return语句。constexpr函数被隐式地指定为内联函数,以便在编译过程中随时展开。

int fun()
{return 10;
}int main()
{constexpr int a = 10;constexpr int b = a + 10;constexpr int c = fun();        //error,fun函数必须是constexpr类型return 0;
}

constexpr int fun()
{}int main()
{constexpr int a = 10;constexpr int b = a + 10;constexpr int c = fun();    //error,fun函数必须有返回值return 0;
}

3、constexpr和指针

在C++中,constexpr用于指示一个值或表达式是常量表达式,它的值在编译时是已知的且不会改变。

以下是关于constexpr和指针的一些要点:

  1. 指向常量的指针
    一个指针可以是constexpr,如果它指向的对象是常量,并且该指针在初始化后不会改变。但是,这并不保证所指向的对象的内容也是常量(只是指针本身是常量)。

    constexpr int* ptr = &a; // 指向常量的指针
    // 注意:a 必须是一个在编译时已知地址的常量
    
  2. 指向字面量的指针
    指向字符串字面量或其他字面量的指针也可以是constexpr,因为这些字面量的地址在编译时是已知的。

    constexpr char* str = "Hello, constexpr!"; // 指向字符串字面量的指针
    
  3. 指针的初始化
    constexpr指针必须在声明时初始化,并且之后不能修改。

    constexpr int value = 42;
    constexpr int* ptr = &value; // 正确:在声明时初始化
    ptr = &anotherValue; // 错误:不能修改constexpr指针
    
  4. 指针运算
    由于constexpr指针指向的值在编译时是已知的,因此你不能对它们进行指针运算(如递增或递减),除非这些运算的结果在编译时也是已知的。

  5. 指向数组的指针
    你可以有一个constexpr指针指向数组的首元素,但这并不意味着整个数组都是constexpr。只有数组的内容在编译时已知,并且数组本身被声明为constexpr时,这样的数组才是constexpr数组。

  6. 指向非常量数据的constexpr指针
    虽然技术上可以有一个constexpr指针指向非常量数据(即不是const的数据),但这样做通常没有太多意义,因为constexpr的主要目的是表示编译时常量。

  7. constexpr函数和指针
    constexpr函数中,你可以返回指向常量数据的指针,但返回的指针必须指向在编译时已知地址的对象。

    constexpr int* getPointer() {static int value = 42; // 静态局部变量具有固定的地址return &value;
    }
    

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

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

相关文章

关于keil中勾选微库Use MicroLIB调试printf时编译报错问题

报错内容: .\Objects\01_USART_Printf.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_gd32e23x.o). .\Objects\01_USART_Printf.axf: Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).问题描述 在keil中勾选…

JSON Web Token(JWT) 简介

JSON Web Token(JWT) 简介 1 什么是 JWT? JWT(JSON Web Token)是认证解决方案,下面介绍它的原理和用法. 2 JWT 的结构 JWT 的结构如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2Q…

docker容器安装MySQL

安装5.7的版本 可以改一下docker的源 docker pull mysql:5.7docker pull mysql:5.7docker imagesdocker ps -a docker run \ --name mysql \ -d \ -p 3306:3306 \ --restart unless-stopped \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -…

沟通技巧

第一步:搞定情绪 充分表达尊重,(不吝赞美,如何夸奖别人?从细节和对比可以发现) 夸人的时候不要太笼统,如:你穿的真好看和今天 上衣显的你很白,太美了。。 显然后面这一句显得更加的真诚 找不到细节就用对比,你穿的真好看,比一般人有气质多了。 对比找不到,就直接夸…

从字符串A中删除字符串B中存在的字母(不区分大小写)C语言实现

实现对字符串A进行处理,参照字符串B,只有字符串B中的字母在字符串A存在,则不分大小写,从字符串A中删除。C语言实现。V1.0 2024年5月7日 发布于博客园题目:​ 设计一程序实现功能,处理字符串A,处理规则是:只要B字符串里面有的字母,不区分大小写,一律从A字符串中删掉。…

[SNOI2019] 数论

这一道题目最好记住,就是两个模数之间在互相作用 首先转化一下,我们枚举其中一个集合然后快速查询另一个集合 也就变成了\((a_i+kP)mod\: Q∈B\) 然后看这篇文章的建模 解释一下 它是将\([0,Q)\)中的每一个数弄成一个环,就像下面这样然后加一个\(P\)就相当于瞬时间走\(P\)步…

andriod sdk 安装

1、下载andriod sdk tools https://www.androiddevtools.cn/ 2、解压zip包 dos窗口进入 解压路劲 执行 tools\android.bat update sdk --no-ui(解压目录中SDK Readme.txt)

R语言分析糖尿病数据:多元线性模型、MANOVA、决策树、典型判别分析、HE图、Boxs M检验可视化

全文链接:https://tecdat.cn/?p=33609 原文出处:拓端数据部落公众号 背景 Reaven和Miller(1979)研究了145名非肥胖成年人的葡萄糖耐量和胰岛素血液化学指标之间的关系。他们使用斯坦福线性加速器中心的PRIM9系统将数据可视化为3D,并发现了一个奇特的图案,看起来像是一个…