Modern C++字面量一网打尽

C++ Literals

数值

二进制、八进制、十六进制字面量

  • 二进制:0b0B开头。
  • 八进制:0开头。
  • 十六进制:0x0X开头。
// for different base
constexpr int base2 = 0b1111;  // 二进制 15
constexpr int base8 = 017;     // 8进制 15
constexpr int base10 = 15;     // 十进制 15
constexpr int base16 = 0xf;    // 16进制 15
// 检查
static_assert(base2 == 15);
static_assert(base8 == 15);
static_assert(base10 == 15);
static_assert(base16 == 15);

单引号作为数值分隔符

C++14 引入了单引号作为数值分隔符,可以提高可读性。

// ' separator for digit grouping
constexpr int a = 1'000'000;  // 1000000, 十进制
static_assert(a == 1000000);

// 同样适用于其他进制单位
constexpr int c = 0b1'0000;  // 16, 二进制
static_assert(c == 16);

constexpr int d = 01'0000;  // 4096, 八进制
static_assert(d == 4096);

constexpr int b = 0x1'0000;  // 65536, 十六进制
static_assert(b == 65536);

修饰存储类型

  • uU:表示无符号整数(unsigned)。
  • lL:表示长整型(long)。
  • llLL:表示长长整型(long long)。
  • z:表示带符号的std::size_t
// 修饰存储类型
#include <type_traits>
auto si = 1;  // int, 默认
static_assert(std::is_same_v<decltype(si), int>);

auto ui = 1u;  // unsigned int
static_assert(std::is_same_v<decltype(ui), unsigned int>);

auto ul = 1ul;  // unsigned long
static_assert(std::is_same_v<decltype(ul), unsigned long>);

auto ull = 1ull;  // unsigned long long
static_assert(std::is_same_v<decltype(ull), unsigned long long>);

auto l = 0l;  // long
static_assert(std::is_same_v<decltype(l), long>);

auto ll = 0ll;  // long long
static_assert(std::is_same_v<decltype(ll), long long>);

auto z = 0z;  // from C++23, 带符号的 std::size_t
static_assert(std::is_same_v<decltype(z), std::ptrdiff_t>);

auto uz = 0uz;  // from C++23
static_assert(std::is_same_v<decltype(uz), std::size_t>);
#include <vector>
void sample(std::vector<int>& vec) {
  // uz 的另外一个用法, 如果不加后缀会出现无符号数和有符号数的比较警告
  for (auto i = 0uz; i < vec.size(); ++i) {
    // do something
  }
  // 逆序遍历
  for (auto i = vec.size(); i--;) {
    // do something
  }
}

浮点数字面量修饰符:

  • fF:表示float类型。
  • lL:表示long double类型。
// 修饰浮点数
auto f = 1.0f;  // float
static_assert(std::is_same_v<decltype(f), float>);
auto d = 1.0;  // double, 默认
static_assert(std::is_same_v<decltype(d), double>);
auto ld = 1.0l;  // long double
static_assert(std::is_same_v<decltype(ld), long double>);

科学计数法

// 科学计数法
constexpr double e = 1e3;  // 1000.0
static_assert(e == 1000.0);
constexpr auto E = 1E3;  // 1000.0
static_assert(E == 1000.0);

字符字面量

字符字面量修饰符:

  • u:表示一个UTF-16字符(char16_t类型)。
  • U:表示一个UTF-32字符(char32_t类型)。
  • L:表示一个宽字符(wchar_t类型)。
  • u8:表示一个UTF-8字符(char类型)。
// 修饰字符
auto c = 'a';  // char, 默认
static_assert(std::is_same_v<decltype(c), char>);

auto wc = L'汉';  // wchar_t
static_assert(std::is_same_v<decltype(wc), wchar_t>);

auto u8c = u8'a';  // char8_t
static_assert(std::is_same_v<decltype(u8c), char8_t>);

auto u = u'a';  // char16_t
static_assert(std::is_same_v<decltype(u), char16_t>);

auto U = U'a';  // char32_t
static_assert(std::is_same_v<decltype(U), char32_t>);

字符串字面量

原始字符串字面量

对于多行字符串,可以使用原始字符串字面量,这样就不需要转义字符了。

// 原始字符串字面量
auto json = R"({"key": "value"})";
static_assert(std::is_same_v<decltype(json), const char*>);

std::string 字面量

C++14 引入了std::string字面量,可以直接使用字符串字面量初始化std::string对象。

// std::string 字面量
#include <string>
using namespace std::string_literals;  // C++14
auto str = "hello"s;                   // 注意这里的 s
static_assert(std::is_same_v<decltype(str), std::string>);

utf-8 字符串字面量

C++17 引入了utf-8字符串字面量,可以直接使用utf-8字符串字面量初始化std::string对象。

// utf-8 字符串字面量
auto utf8 = u8"你好";
static_assert(std::is_same_v<decltype(utf8), const char*>);

其他字面量

布尔字面量

// 布尔字面量
auto boolean = true;  // bool, 默认
static_assert(std::is_same_v<decltype(boolean), bool>);
auto b2 = false;  // bool
static_assert(std::is_same_v<decltype(b2), bool>);

空指针字面量

// 空指针字面量
auto null = nullptr;  // std::nullptr_t, 默认
static_assert(std::is_same_v<decltype(null), std::nullptr_t>);

用户定义的字面量(User-Defined Literals, UDL)

C++11 引入了用户定义的字面量(User-Defined Literals, UDL),允许程序员为自定义类型定义自己的字面量表示。这通过定义一个字面量运算符实现,运算符以 _ 开头,后跟一个或多个字符。

以下是一个简单的例子,定义一个用于表示长度的用户定义字面量:

#include <iostream>

// 定义一个表示长度的结构体
struct Length {
  double value; // 长度值
  enum Unit { meter, kilometer, centimeter }; // 单位
  Unit unit; // 长度单位

  // 构造函数
  Length(double val, Unit u) : value(val), unit(u) {}
};

// 用户定义的字面量,用于米
Length operator"" _m(long double val) {
  return Length(val, Length::meter);
}

// 用户定义的字面量,用于千米
Length operator"" _km(long double val) {
  return Length(val, Length::kilometer);
}

// 用户定义的字面量,用于厘米
Length operator"" _cm(long double val) {
  return Length(val, Length::centimeter);
}

int main() {
  Length length1 = 10.0_m; // 10米
  Length length2 = 5.0_km; // 5千米
  Length length3 = 100.0_cm; // 100厘米

  std::cout << "Length1: " << length1.value << " meters\n";
  std::cout << "Length2: " << length2.value << " kilometers\n";
  std::cout << "Length3: " << length3.value << " centimeters\n";

  return 0;
}

源码

完整的样例在这里.

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

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

相关文章

基于Jmeter的分布式压测环境搭建及简单压测实践

写在前面 平时在使用Jmeter做压力测试的过程中&#xff0c;由于单机的并发能力有限&#xff0c;所以常常无法满足压力测试的需求。因此&#xff0c;Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例&#xff0…

【linux学习十七】文件服务管理

一、FTP FTP server:FTP(File Transfer Protocol,文件传输协议 )是 TCP/IP 协议组中的协议之一 软件包&#xff1a;vsftpd/安装 yum -y install vsftpd//准备文件 touch /var/ftp/abc.txt //注释:FTP服务器的主目录:“/var/ftp/”&#xff0c;是FTP程序分享内容的本机目录…

Docker 安装和加速

目录 1.安装 2.了解 docker 信息 3.查询状态 4. 重新启动Docker 1.安装 yum install –y docker 2.了解 docker 信息 cat /etc/redhat-release 3.查询状态 systemctl status docker 4.支持 1.12 的 docker 镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docke…

stm32学习笔记---TIM输出比较(代码部分)定时器定时中断/定时器外部时钟

目录 第一个代码&#xff1a;定时器定时中断 Timer.c 初始化函数 初始化定时器的步骤 定时器的库函数 TIM_DeInit TIM_TimeBaseInit TIM_TimeBaseStructInit TIM_Cmd TIM_ITConfig TIM_InternalClockConfig TIM_ITRxExternalClockConfig TIM_InputTriggerSource …

一文读懂客户管理系统平台:概念、功能与应用场景介绍!

在当今竞争激烈的市场环境下&#xff0c;企业想要保持竞争力&#xff0c;不仅要有优质的产品和服务&#xff0c;更要有高效的客户管理手段。客户管理系统平台作为一种重要的工具&#xff0c;正在被越来越多的企业所青睐。那么&#xff0c;客户管理系统平台有什么用呢&#xff1…

fidder自动测试cookie脚本

前言 工作在使用fidder抓包时&#xff0c;经常需要找到一个请求携带的cookie中&#xff0c;真正校验了那些cookie&#xff0c;从而在代码中实现写入这些cookie的请求。这个过程除了根据经验快速过滤&#xff0c;就只能一个一个删除测试了。 所以我写了这个脚本&#xff0c;自动…

Telnet远程登录(Cisco)

Telnet 基于TCP/IP协议族 远程终端协议 在Internet上远程登录 VTY(Virtual Teletype) 通过IP连接物理上的终端 实现在Internet上 登陆和配置远程目标终端 A Router>enable Router#config Router(config)#hostname A A(config)#interface gigabitEthernet 0/0 A(confi…

ArkUI开发学习随机——得物卡片,京东登录界面

案例一&#xff1a;得物卡片 代码&#xff1a; Column(){Column(){Image($r("app.media.mihoyo")).width(200).height(200)Row(){Text("今晚玩这个 | 每日游戏打卡").fontWeight(700).fontSize(16).padding(4)}.width(200)Text("No.12").fontWe…

服务器数据恢复—raid故障导致部分分区无法识别/不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌DL380服务器中3块SAS硬盘组建了一组raid。 服务器故障&#xff1a; RAID中多块磁盘出现故障离线导致RAID瘫痪&#xff0c;其中一块硬盘状态指示灯显示红色。服务器上运行的数据库在D分区&#xff0c;备份文件存放在E分区。由于RAID瘫…

游戏AI的创造思路-技术基础-深度学习(2)

感觉坑越挖越大&#xff0c;慢慢填~~~~ 继续上篇进行填坑&#xff0c;这一篇我们介绍下循环神经网络 目录 3.2. 循环神经网络&#xff08;RNN&#xff09; 3.2.1. 算法形成过程 3.2.2. 运行原理 3.2.3. RNN有哪些优缺点 3.2.4. RNN参数 3.2.5. 如何选择RNN模型参数 3.2…

【Playwright+Python】—— 环境搭建及脚本录制!

前言 看到这个文章&#xff0c;有的同学会说&#xff1a; 静姐&#xff0c;你为啥不早早就写完python系列的文章。 因为有徒弟需要吧&#xff0c;如果你也想学自学&#xff0c;那这篇文章&#xff0c;可以说是我们结缘一起学习的开始吧&#xff01; 如果对你有用&#xff0…

Qt开发 | Qt界面布局 | 水平布局 | 竖直布局 | 栅格布局 | 分裂器布局 | setLayout使用 | 添加右键菜单 | 布局切换与布局删除重构

文章目录 一、Qt界面布局二、Qt水平布局--QHBoxLayout三、Qt竖直布局四、Qt栅格布局五、分裂器布局代码实现六、setLayout使用说明七、布局切换与布局删除重构1.如何添加右键菜单2.布局切换与布局删除重构 一、Qt界面布局 Qt的界面布局类型可分为如下几种 水平布局&#xff08;…

Python+Pytest+Allure+Yaml接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人&#xff1a;CesareCheung 更新时间&#xff1a;2024.06.20 一、技术栈 PythonPytestAllureYaml 版本要求&#xff1a;Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 1、安装python3.7&#xff0c;并配置…

解析分子筛自动填充高原制氧机的工作原理及优势

在高原地区&#xff0c;由于空气稀薄&#xff0c;氧气含量相对较低&#xff0c;这给人们的生活、工作和学习带来了诸多不便。为了解决这个问题&#xff0c;高原制氧机应运而生&#xff0c;其中分子筛自动填充高原制氧机以其高效、稳定、安全的特点受到了广泛的关注和应用。 一、…

CRMEB 多门店后台登录入口地址修改(默认admin)

一、>2.4版本 1、修改后端 config/admin.php 配置文件,为自定义的后缀 2、修改 平台后台前端源码中 view/admin/src/settings.js 文件,修改为和上面一样的配置 3、修改后重新打包前端代码,并且覆盖到后端的 public 目录下&#xff1a;打包方法 4、重启swoole 二、<2.4版…

蒙特卡洛树搜索

蒙特卡洛树搜索入门---强化学习 - 知乎蒙特卡洛树搜索&#xff08;Monte Carlo tree search&#xff09;简称MCTS&#xff0c;和一般的蒙特卡洛方法不是一个概念。通俗的理解&#xff0c;蒙特卡洛方法是随机现象中用频率来近似概率&#xff0c;模拟次数越多&#xff0c;结果越准…

从 Hadoop 迁移,无需淘汰和替换

我们仍然惊讶于有如此多的客户来找我们&#xff0c;希望从HDFS迁移到现代对象存储&#xff0c;如MinIO。我们现在以为每个人都已经完成了过渡&#xff0c;但每周&#xff0c;我们都会与一个决定进行过渡的主要、高技术性组织交谈。 很多时候&#xff0c;在这些讨论中&#xff…

项目实训-vue(十一)

项目实训-vue&#xff08;十一&#xff09; 文章目录 项目实训-vue&#xff08;十一&#xff09;1.概述2.页顶导航栏3.导航信息4.总结 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.页顶导航栏 <divstyle"display: flex;justify-content: space-between;alig…

打造智能家居:用ESP32轻松实现无线控制与环境监测

ESP32是一款集成了Wi-Fi和蓝牙功能的微控制器&#xff0c;广泛应用于物联网项目。它由Espressif Systems公司开发&#xff0c;具有强大的处理能力和丰富的外设接口。下面我们将详细介绍ESP32的基础功能和引脚功能&#xff0c;并通过具体的实例项目展示其应用。 主要功能 双核处…

网络安全协议

1. 概述 1.1 网络安全需求 五种需求&#xff1a; 机密性&#xff1a;防止数据未授权公开&#xff0c;让消息对无关听众保密 完整性&#xff1a;防止数据被篡改 可控性&#xff1a;限制对网络资源&#xff08;硬件和软件&#xff09;和数据&#xff08;存储和通信&#xff0…