C++ 字面值常量的类型
在C++中,字面常量(literal constant)即无需定义可以直接写出来的量。字面常量的值一望便知,但是他的数据类型往往不能被准确分辨(尤其是使用auto时)。
我们直接写出来的有确定值的量就是字面常量,如114514
、3.12
、'a'
、1e30
等,那么42
的类型是什么?3.12
是单精度还是双精度?这些都有明确的规定,一个字面常量的类型是由他的形式完全决定的。
1. 整数和浮点数的字面值
整数的字面值
即使没有了解过,也很容易想到114514
肯定是int
类型。那1145141919
呢?超过了int
当然就是一个long long
类型了。C++里整数常量的类型就是int->long->long long
里能表示出它的尺寸最小的类型(显然都是有符号(signed)型)。比如:
2147483547
是int
,而2147483648
就是long long
类型了,而不是unsigned int
。42
即使在short
范围内,类型也为int
而不是short
。-2147483648
在int
范围内,但是仍然是long long
(前面没有提到过负号,实际上-
不在字面值之内,先判定了2147483648的类型再取了符号)1000000000000000000000000
如果这个数连long long
都装不下怎么办?某些编译器可以继续扩展到128位整数(__int128_t
,范围\([-2^{127}, 2^{127})\)),如果更大的话,就不能通过编译了。
不过八进制和十六进制的规则有些不一样。八进制和十六进制常量可以不用负号而表示负数(如0x80000000
),这个时候他的类型会被判定为unsigned
而不是负值。也就是说,此时按照int->unsigned int->.....->long long->unsigned long long
取能表示为正数的最小类型。
浮点数的字面值
与short
和int
的关系类似,虽然float
更小,但是double
才是我们最常用的浮点数类型。在C++里无论时小数表示还是指数表示,无论有几位有效数字,所有的浮点类型默认都是double
(如0.1
、.09878675645
、1e20
、3E-15
)。
手动指定字面值
如果我们需要1个long long
类型的0,或者double
存不下超长的浮点数,就可以在值的后面加上修饰符,手动指定字面值的类型。
u
或U
指定该值为无符号类型,比如2147483648u
是一个unsigned int
,-1U
也是一个“无符号的-1”(即4294967295),l
或L
指定类型为long
,ll
或LL
指定类型为long long
。如
long long a = 3, b = max(a, 0)
会出错,因为a
是long long
而0
为int
导致参数不匹配,修改为b = max(a, 0ll)
即可。u
和ll
可以混用,即ull
和ul
表示无符号长整形。f
或F
指定类型为float
,指数类型和小数类型都可以(如1e3f
、0.12F
)。l
和L
也可以用于浮点,表示指定long double
类型。
当然你也可以使用类型转换,但是略显繁琐。
2. 字符和字符串的字面值
C++中char类型一般以\([0, 128)\)的整数与ASCII字符相对应。单个ASCII字符的类型当然是char
(如'a'
表示char大小的字符a,即97)。
字面字符串则是一个常量字符数组const char[]
或const char*
(并不是string
)。在传参时,如果将常量字符串传入f(char *s)
中,并修改字符串的值,将引发错误。
手动指定字面值
' '
的类型都是char
,不能使用汉字等其他字符,如果要指定宽字符(wide char)的字面量。可以在前面加上u
(表示16位字符char16_t
)、U
(表示32位字符char32_t
)或L
(表示宽字符wchar_t
,在不同环境下为16位或32位),比如u'天'
。
(当然这只是启用中文字符串的一个步骤,还需要一系列宽字符的工具才能实现中文操作)
3. 布尔字面值
布尔字面值只有两种:true
和false
。
true
转化为任意数时值为1,false
转化为任意数时值为0
- 任意非0数转化为
bool
时,只有原数等于0时变为false
,否则都为true
(不过浮点数的判定方法有点特殊,由于浮点数的等于是“近似相等”,如果double x=0.1+0.2-0.3
,在某些环境下x==0
为true
,但x
的实际值由于浮点误差并不为0(非常接近0的一个数),如果有循环if (x) {}
将仍然执行,除非x的实际值真的是0(正0或负0),才不会执行)
4. 指针字面值
指针字面值只有一个,那就是空指针nullptr
。
我们知道nullptr
、NULL
和0
都可以初始化空指针,其中nullptr
是类似true
和false
的字面值关键字,而NULL
仅仅是定义在头文件里宏,其含义就是“0”,也就是说与0
没有区别。
那为什么要专门在C++11里弄一个nullptr
呢。因为nullptr
是“指针”,而单独存在的0是“int”。类似之前提到的max问题
。如果有两个同名函数f(int x)
和f(int *x)
,如果传入f(NULL)
,由于NULL
的值为0,就会调用前者,要调用后者,则只能使用f(nullptr)
。
C++ 字面值常量的类型的更多相关文章
- 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)
十六进制数相等的推断 请问例如以下程序的输出是神马? #include <iostream> #include <string> using namespace std; in ...
- c++学习笔记——字面值常量类
字面值常量类:数据成员都是字面值类型的聚合类是字面值常量类.如果一个类不是聚合类,但是它符合一下要求,则它也是个字面值常量类: 1.数据成员都必须是字面值类型. 2.类必须至少含有一个constexp ...
- 字面值常量&&转义序列
字面值常量举例: 字面值常量的分类 示例 备注 整型 42.024(八进制数).0x23(十六进制) short类型没有对应的字面值 浮点型 3.14.3.14E2(指数) 默认类型是double 字 ...
- ios swift 里面关于变量 常量 可选类型 控制流的一些心得
//swift 里面没有头文件和实现文件.只有一个.swift文件 //swift 里面没有main的概念,程序从main.swift开始执行 //swift 每一条执行语句可以不用分号结束,多条语句 ...
- 【c++primer练习】 typedef与指针、常量和类型别名
# c++primer 61页 typedef char* ptr ; cstr 是一个指向 char 的常量指针, 一种错误的理解是将语句等同于const char* ptr cstr; 但 ptr ...
- Java基础(变量数&常量&据类型&类型转换)
什么是变量: 变量就是一个不固定的数值,它随时会改变,就像银行卡里存的钱一样会变动. 变量的格式:1 数据类型 变量名=变量值: 2 数据类型 变量名: 变量名=变量值: 变量的三大要素:1变量 ...
- C 常量的类型
http://bbs.csdn.net/topics/380028485 整型常量的类型是下列相应表中第一个能表示其值的类型: int --> long int --> long long ...
- C#中的常量、类型推断和作用域
一.常量 常量是其值在使用过程中不会发生变化的变量.在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量: const int a=100;//a的值将不可以改变 常量的特 ...
- swift语法之常量 变量 类型
常量和变量: 在swift中声明变量或者声明常量的时候可以不用写变量或者常量类型 因为系统会自动推导出对应的类型. 变量:可以更改值 swift中每句代码后面不需要加 ; 号 var num = 5 ...
- C++ 变量、常量、符号常量
变量: int i = 0; // i 是变量 i=5; //i 可以修改 变量就是程序内一个内存位置的符号名,在该内存位置可以保存数据,并可以通过符号名对该内存地址存放的数据进行访 ...
随机推荐
- 修改linux系统时间由UTC改为CST(中国上海)时区
Ubuntu系统 1. 将时间改为CST的中国上海时间: 命令: sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 或: sudo ...
- Java和LWJGL的关于OpenAL的文章
一.OpenAL的原理和基本概念: 1.1 OpenAL的架构 OpenAL的架构同样基于三个核心组件:Context(上下文).Source(声源)和Buffer(缓冲区).Context代表了音频 ...
- java-多线程(下)
多线程简单入门(Java)(下篇:多线程Java中的使用) 目录 一.创建多线程 二.线程的安全 三.线程的通信 一.创建多线程 在Java中,多线程的创建有4种方式. 方式一:继承于Thread类; ...
- Linux 网络设备命名规则
在 Linux 系统中,网络接口的命名规则已经经历了几次重要变化,特别是从传统的以 eth 和 wlan 开头的名称,转变到更现代.更具描述性的命名方式.以下是这些变化的概述: 1. 传统命名约定 在 ...
- 喜报!Fluent Editor 开源富文本迎来了第一位贡献者!
你好,我是 Kagol,个人公众号:前端开源星球. 2024年8月20日,刚开源一周的富文本 Fluent Editor 迎来了第一位贡献者:zzxming 1 Bug 描述 zzxming 同学修复 ...
- Typora mac激活
typora mac版本激活 我也是第一次使用mac电脑,在安装时基本上都是付费的,在mac下载使用typora是试用一段时间后是需要付费购买的,苦无能力有限只能绕一下,感谢网上的各位大佬的分享 来源 ...
- kubernetes删除ns异常状态为:Terminating
在部署kuboard控制平台的时候,不规范删除,导致ns状态为Terminating [root@master01 ~]# kubectl delete namespace kuboard ^C ro ...
- sql语句去掉前面的0(前导零,零前缀)
sql还有个stuff的函数,很强悍. 一个列的格式是单引号后面跟着4位的数字,比如'0003,'0120,'4333,我要转换成3,120,4333这样的格式,就是去掉单引号和前导的0,用以下语句就 ...
- VS2022 17.12.0 Preview2版本对Copilot的功能增强
前提条件,使用最新版的17.12.0 Preview2,并且有有效的Copilot AI订阅,那么可以体验这个新鲜好用的功能 增强了Copilot AI对IEnumerable Visualizer的 ...
- Azure 入门系列 (外传 小知识)
数据中心地理结构 Azure 数据中心有很多,这我们知道, 但是我们还需要知道它的结构, 不然在做 Backup, Recovery Disaster 的时候会卡卡. 参考: Region, Avai ...