C++新特性 字面量优化

简介: C++新特性 字面量优化

本篇文章描述一下字面量优化

1.字面量介绍

字面量(Literal)是指在源代码中直接使用的常量值,它们表示了具体的数值、字符、字符串、布尔值等。字面量是程序中固定不变的数据。

以下是几种常见的字面量类型:

  1. 整数字面量:表示整数值,如 042-10 等。
  2. 浮点数字面量:表示带有小数部分的实数值,如 3.14-0.5 等。
  3. 字符字面量:用单引号括起来的单个字符,如 'A''x' 等。
  4. 字符串字面量:用双引号括起来的一串字符序列,如 "Hello, World!"
  5. 布尔字面量:表示真或假的逻辑值,有两个取值:truefalse
  6. 指针字面量:用于表示空指针,在 C++ 中为 nullptr

除了上述基本类型的字面量外,C++ 还提供了其他类型的自定义字面量。通过定义自己的后缀操作符函数(Suffix Operator Function),可以使特定形式的字面量具有自定义行为

上述描述中提到了后缀操作符的函数  后缀操作符是通过采用函数的形式来控制字面量 这样就可以人为的控制字面量了

字面量函数基本语法

return_type operator  " "  identifier (parmars)

说明 :return_type 返回类型 parmars参数列表

代码实例:

#include <iostream>
// 自定义整数字面量函数
constexpr int operator"" _double(unsigned long long num) {
    return num * 2;
}
int main() {
    int x = 5_double;  // 使用自定义整数字面量函数
    std::cout << x << std::endl;  // 输出:10
    return 0;
}

2.十六进制浮点字面量 std::hexfloat &std::defaultfloat(C++17以后可以直接书写16进制字面量)

作用 hexfloat可以把浮点数常量 16进制

       defaultfloat 是将16进制浮点数化为浮点数常量

代码实例:

#include<bits/stdc++.h>
using namespace std;
// 自定义整数字面量函数
int main() 
{
    double float_array[]{ Ox1.7+2,Ox1.f4+9,0x1.df3b64p-4 };
    for (auto elem : float_array)
    {
        cout << hexfloat << elem<<"="<<defaultfloat<<elem<<endl;
    }
    return 0;
}

以上代码说明了hexfloat  defaultfloat两种形式的相互转化

拓展(了解即可)

16进制浮点数转换为10进制浮点数:

0x1.f4是一个十六进制浮点数。在IEEE 754浮点表示中,它可以表示为:

符号位:0(正数) 指数位:2(偏移后的指数值) 尾数位:f4(二进制小数)

对于尾数部分,将其转换为二进制小数形式,即11110100。

根据规范,浮点数的计算公式为:(-1)^s * (1 + 尾数) * 2^(指数 - 偏移值)

代入具体的值: 符号位 s = 0 (正数) 尾数 f = 1.1110100 指数 e = 2 (偏移后的指数值)

则计算结果为: (-1)^0 * (1 + 1.1110100) * 2^(2 - 偏移值)

偏移值是15(对于双精度浮点),因此得到: (1 + 1.953125) * 2^(-13)

化简得: 3.90625 * 2^(-13)

最终结果约等于: 11.953125 × 10^(-4)

二进制整数字面量:

意思 就是以二进制的方式来表现常量的形式 二进制字面量也是右值的一部分。就是在二进制数值前面加上前缀 0b(0B) 即可 注意不是O

代码实例:

#include <iostream>
int main() {
    // 使用0b前缀表示二进制字面量
    int binaryNumber = 0b101010;
    
    std::cout << "Binary Number: " << binaryNumber << std::endl;
    
    return 0;
}
//Binary Number: 42

总结:字面量是右值的一部分 由于右值在计算机内存中没有开辟空间储存 所以直接使用操作起来比较难 但是C++17即以上特性新出了一些函数 他们能够较好的使用我们的字面量    

好了 本篇文章的内容就到这里 在这里小编想给大家推荐一个课程 喜欢C++的小伙伴可以考虑一下:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
|
1月前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
46 2
|
1月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
105 59
|
1月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
61 6
|
1月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
55 7
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
30天前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
32 0
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析继承机制(三)
【C++】面向对象编程的三大特性:深入解析继承机制
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析继承机制(二)
【C++】面向对象编程的三大特性:深入解析继承机制