C++学习笔记九:值,常量,常表达式和常初始化
1. 值:
Literal: Data that is directly represented in code without going through some other variable stored in memory.
值: 直接在代码中表示的数据,无需通过内存中存储的其他变量。值不在内存中进行存储,而是直接在二进制的可执行文件中产生。
1.1 整型
//Literal types : u and l combinations for unsigned and long.(大小写都可)
unsigned char unsigned_char {53u};// 555U would fail because of narrowing
//2 Bytes
short short_var {-32768} ; // No special literal type for short)
short int short_int {455} ; // No special literal type for short
signed short signed_short {122}; // No special literal type for short
signed short int signed_short_int {-456}; // No special literal type for short
unsigned short int unsigned_short_int {5678U };
// 4 Bytes
const int int_var {55} ; //
signed signed_var {66}; //
signed int signed_int {77}; //
unsigned int unsigned_int {555U}; //
//4 or 8 Bytes
long long_var {88L}; // 4 OR 8 Bytes
long int long_int {33L};
signed long signed_long {44l};
signed long int signed_long_int {44l};
unsigned long int unsigned_long_int {555ul};
//8 Bytes
long long long_long {888ll};// 8 Bytes
long long int long_long_int {999ll};
signed long long signed_long_long {444ll};
signed long long int signed_long_long_int{1234ll};
//Grouping Numbers : C++14 and onwards
unsigned int prize {1'500'00'0u};
std::cout << "The prize is : " << prize << std::endl;
std::cout << " signed_long_long_int : " << signed_long_long_int << std::endl;
//Narrowing errors
//Possible narrowing errors are cought by the braced initializer method.
//Assignment and functional don't catch that.
//unsigned char distance {555u}; //Error [0~255]
//unsigned int game_score {-20}; //Error
1.2 十六进制赋值:
//With number systems - Hex : prefix with 0x
unsigned int hex_number{ 0x22BU}; // Dec 555
int hex_number2 {0x400};// Dec 1024
std::cout << std::hex << "The hex number is : " << hex_number << std::endl;
std::cout << std::dec << "The hex number2 is : " << hex_number2 << std::endl;
//review: direct output only gives devimal number, use std::hex to get hex output
//Representing colors with hex
int black_color {0xffffff};
std::cout << "Black color is : " << std::dec << black_color << std::endl;
1.3 八进制赋值:
//Octal literals : prefix with 0
int octal_number {0777u}; // 511 Dec
std::cout << std::oct << "The octal number is : " << octal_number << std::endl;
//!!BE CAREFUL NOT TO PREFIX YOUR INTEGERS WITH 0 IF YOU MEAN DEC
int error_octal {055};// This is not 55 in memory , it is 45 dec
std::cout << "The erronous octal number is : " << error_octal << std::endl;
1.4 二进制赋值
//Binary literals
unsigned int binary_literal {0b11111111u};// 255 dec
std::cout << "The binary literal is : " << binary_literal << std::endl;
1.5 其他类型赋值
char char_literal {'c'};
int number_literal {15};
float fractional_literal {1.5f}; //不加f默认只是double类型
std::string string_literal {"Hit the road"};
2. 常量
const: A read only variable. Cannot assign data to it.
常量:是一个只读值,不能赋值,CPU并没有常量的概念,是程序层在constant对变量修饰后导致变量只读的属性。一般用于定义在整个程序运行周期内都不想被改变的量。常量在声明的时候必须赋值。
const int age {34};
const float height {1.67f};
//age = 55; // Can't modify
//height = 1.8f;
3. 常表达式
constexpr: A constant that has the potential to be evaluated at compile time
3.1 程序的产生过程:
IDE Code -> Compile time(从代码生成二进制可执行文件) -> Run time
如果可能的话,把复杂的计算放到编译中去做(Compile time computations),一旦编译完成,在运行时可以直接调用编译生成的结果。c++11之后引入的特性。
可执行二进制文件的一般执行过程:
initialization->Constexpr computation->Runtime computation
改进后:
initialization->Runtime computation
3.2 举例:
constexpr int SOME_LIB_MAJOR_VERSION {1237};
constexpr int eye_count {2};
constexpr double PI {3.14};
//eye_count = 4; //error
std::cout << "eye count : " << eye_count << std::endl;
std::cout << "PI : " << PI << std::endl;
// int leg_count {2}; // Non constexpr
// leg_count is not known at compile time
// constexpr int arm_count{leg_count}; // Error, cannot initialize a compile
// time variable with a runtime variable
constexpr int room_count{10};
constexpr int door_count{room_count};// OK
const int table_count{5};
constexpr int chair_count{ table_count * 5};// Works
static_assert( SOME_LIB_MAJOR_VERSION == 123); //compile time check
// int age = 5;
// static_assert( age == 5); //不能检查非constant变量
std::cout << "App doing its thing..." << std::endl;
4. 常初始化(C++20特性)
constinit: A variable that should be initialized with a constant or literal at compile time
指定变量必须拥有静态初始化,即零初始化与常量初始化,否则程序非良构。这种变量必须是静态的或者是全生命周期的variables with static or thread storage duration。
什么是静态变量:When you declare a variable in a function, the static keyword specifies that the variable retains its state between calls to that function. When you declare a data member in a class declaration, the static keyword specifies that one copy of the member is shared by all instances of the class.
可以帮助解决在主函数外的初始化问题。必须初始化。const和constinit可以结合使用,const和constexpr不可以结合使用。const init不说明变量是常量,只是说明编译器强制其在编译过程中初始化。
#include <iostream>
const int val1 {33};
constexpr int val2{34};
int val3 {35}; // Run time value
constinit int age = 88; // This is initialized at compile time
const constinit int age1 {val1}; // const and constinit can be combined
constinit int age2 {age1}; // Initializing with age would lead to a compiler error
// age is not const
//constinit int age3 {val3}; // Error : val3 is evaluated at run time
// can't const initialize age3
const constinit double weight {33.33};
//constexpr constinit double scale_factor{3.11};// Can't combine constexpr and constinit
int main(){
//constinit double height{1.72}; //compiler error, not static or thread storage duration
std::cout << "age : " << age << std::endl;
std::cout << "age1 : " << age1 << std::endl;
std::cout << "age2 : " << age2 << std::endl;
age =33; // Can change a const init variable
std::cout << "age : " << age << std::endl;
//Combining const and constinit
std::cout << "weight : " << weight << std::endl;
//weight = 44.44; // Compiler error
return 0;
}
C++学习笔记九:值,常量,常表达式和常初始化的更多相关文章
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- C#学习笔记之值类型与引用类型
[TOC] C#学习笔记之值类型与引用类型 1.值类型与引用类型 1.1 深层区别 值类型与引用类型有不同的内存分布,这导致了不同的内存管理机制: 值类型由OS负责内存管理 引用类型由垃圾回收器(GC ...
- MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
<Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次 SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...
- Go语言学习笔记三: 常量
Go语言学习笔记三: 常量 定义常量 常量就是在声明后不能再修改的量. const x int = 100 const y string = "abc" const z = &qu ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...
- C#线程学习笔记九:async & await入门二
一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
随机推荐
- [ABC145F] Laminate
2023-02-25 题目 题目传送门 翻译 翻译 难度&重要性(1~10):6 题目来源 AtCoder 题目算法 dp 解题思路 引子:积木大赛 可以发现当 \(k=1\) 时,就是积木大 ...
- python独立脚本应用Django项目的环境
一.需求说明 一直用 Django 在开发一个网站项目,其中的注册用户和登录,都是使用Django自带的认证系统.主要是对密码的加密,在注册或者登录的时候,前端传递多来的密码,我会使用Django的s ...
- Web通用漏洞--sql注入
SQL注入 mysql注入目的:获取当前web权限 mysql注入--常规查询&union联合查询 MYSQL--Web组成架构 服务器搭建web服务可能存在多个站点搭建在一台服务器中,数据集 ...
- Python字符串操作函数split()和join()
字符串拆分 在python中有切片(Slice)操作符,可以对字符串进行截取,还提供了split()函数可以将一个 字符串分裂成多个字符串组成的列表.在使用split()函数来拆分字符串之前,我们先来 ...
- shopee的前景以及商用API(代码封装)
Shopee平台是东南亚和台湾地区最具代表性的电商平台之一,在过去几年里取得了巨大的成功.以下是Shopee平台的发展前景: 电商市场的快速增长:东南亚和台湾地区是人口众多.市场潜力巨大的区域,电商市 ...
- brpc internal
brpc 内部实现 thread model pthread 1:1atomic cache同步降低性能 fiber n:1 -> nginx 多核难以扩展, 用户不能做阻塞操作. contex ...
- ERP进销存系统源码
介绍 ERP进销存管理系统 软件架构 核心框架:SpringBoot 2.0.0 持久层框架:Mybatis 1.3.2 日志管理:Log4j 2.10.0 JS框架:Jquery 1.8.0 UI框 ...
- SQL查询中的小技巧:SELECT 1 和 LIMIT 1 替代 count(*)
前言 在写SQL查询时,常规做法是使用SELECT count(*)来统计符合条件的记录数. 然而,在某些情况下,我们只关心是否存在符合条件的记录,而不需要知道具体的记录数. 为了优化性能,可以改用使 ...
- Microsoft Build 2021大会开始后,Develop Blog一系列更新
.NET BLOG 发布.NET 6预览版4 https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4/ 发布.NET MAUI ...
- LeetCode 周赛上分之旅 #47 前后缀分解结合单调栈的贡献问题
️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...