首页 > 编程语言 >79.C++ 中的字面值常量

79.C++ 中的字面值常量

时间:2023-04-29 23:56:50浏览次数:35  
标签:字符 常量 long 字符串 C++ 类型 面值 八进制 79

  一个形如42的值被称作字面值常量(literal),这样的值一望而知。每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。

1.整型和浮点型字面值

  可以将整型字面值写作十进制数、八进制数或十六进制数的形式。以0开头的整数代表八进制数,以0x或0X开头的代表十六进制数。例如,我们能用下面的任意一种形式来表示数值20:

20/*十进制*/   024/*八进制*/   Ox14/*十六进制*/ 

  整型字面值具体的数据类型由它的值和符号决定。默认情况下,十进制字面值是带符号数, 八进制和十六进制字面值既可能是带符号的也可能是无符号的。十进制字面值的类型是int、long和long long中尺寸最小的那个(例如,三者当中最小是int),当然前提是这种类型要能容纳下当前的值。八进制和十六进制字面值的类型是能容纳其数值的 int、unsigned int、long、unsigned long、long long和unsigned long long 中的尺寸最小者。如果个字面值连与之关联的最大的数据类型都放不下,将产生错误。类型short没有对应的字面值。在表1中,以后缀代表相应的字面值类型。

  尽管整型字面值可以存储在带符号数据类型中,但严格来说,十进制字面值不会是负数。如果我们使用了一个形如-42的负十进制字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。

  浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用E或e标识:

3.14159    3.14159E0    0.   0e0     .001 

2.字符和字符串字面值

  由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。

'a'   //字符字面值
"Hello world!"  //字符串字面值

  字符串字面值的类型实际上是由常量字符构成的数组(array)。编译器在每个字符串的结尾处添加一个空字符('\0'),因此,字符串字面值的实际长度要比它的内容多1。例如,字面值'A'表示的就是单独的字符A,而字符串"A"则代表了一个字符的数组,该数组包含两个字符:一个是字母A、另一个是空字符。如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一 个整体。当书写的字符串字面值比较长,写在一行里不太合适时,就可以采取分开书写的方式:

//分多行书写的字符串字面值
std::cout << "a really, really long string literal" 
             "that spans two lines" << std::endl; 

3.转义序列

  有两类字符程序员不能直接使用:一类是不可打印(nonprintable)的字符,如退格或其他控制字符,因为它们没有可视的图符;另一类是在C++语言中有特殊含义的字符(单引号、双引号、问号、反斜线)。在这些情况下需要用到转义序列(escape sequence),转义序列均以反斜线作为开始,C++语言规定的转义序列包括:

换行符:\n            横向制表符:\t          报警(响铃):\a
纵向制表符:\v         退格符:\b             双引号:\”
反斜线:\\            问号:\?              单引号:\’
回车符:\r            进纸符:\f

在程序中,上述转义序列被当作一个字符使用:

  也可以使用泛化的转义序列,其形式是\x后紧跟l个或多个十六进制数字,或者\后 紧跟1个、2个或3个八进制数字,其中数字部分表示的是字符对应的数值。假设使用的是Latin-1字符集,以下是一些示例:

\7 (响铃)  \12(换行符)  \40(空格)
\0(空字符) \115(字符M)  \x4d(字符M)

注意,如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列。例如, ”\1234 ”表示2个字符, 即八进制数123对应的字符以及字符4。 相反,\x要用 到后面跟着的所有数字,例如, ”\x1234 ”表示一个16位的字符,该字符由这4个十进制数所对应的比特唯一确定。 一般来说, 超过8位的十六进制字符都是与表1中某个前缀作为开头的扩展字符集一起使用的。

4.指定字面值的类型

  通过添加如表1中所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型。

L'a'         //宽字符型字面值,类型是wchar_t
u8"hi!"      //utf-8字符串字面值(utf-8用8位编码一个Unicode字符)
42ULL        //无符号整型字面值,类型是unsigned long long 
1E-3F        //单精度浮点型字面值,类型是float
3.14159L     //扩展精度浮点型字面值,类型是long double 

建议:当使用一个长整型字面值时,请使用大写字母L未标记,因为小写字母l和数字1太容易混淆了。

加前缀u Unicode 16 字符 char16_t类型
加前缀U Unicode 32 字符 char32_t类型
加前缀L 宽字符 wchar_t类型
加前缀u8 utf-8字符(仅用于字符串字面值常量) char类型(8位编码一个Unicode字符)

表2.2指定字面值的类型

字符和字符串字面值
前缀 含义 类型
u Unicode 16字符 char16_t
U Unicode 32字符 char32_t
L 宽字符 wchar_t
u8 UTF-8(仅用于字符串字面常量) char
整型字面值 浮点型字面值
后缀 最小匹配类型 后缀 类型
u or U unsigned f或F float
l or L long l或L long double
ll or LL long long

5.布尔字面值和指针字面值

true和false是布尔类型的字面值:

bool test = false; 

nullptr是指针字面值

参考资料:

C++Primer

标签:字符,常量,long,字符串,C++,类型,面值,八进制,79
From: https://www.cnblogs.com/codemagiciant/p/17364716.html

相关文章

  • 【c++基础】程序运行时间计时
    使用std::chrono计算程序运行时间#include<iostream>#include<string>#include<chrono>voidRun(){ for(inti=0;i<1000000000;++i) { }}intmain(){ autobeforeTime=std::chrono::steady_clock::now(); Run(); autoafterTime......
  • Codeforces 1799H - Tree Cutting(树形 dp)
    思考的时候一直卡在不会在低于\(O(n)\)的时间内储存一个连通块的\(siz\)有关的信息,看了洛谷题解之后才发现我真是个小丑。树形DP。对于一条我们需要操作的边\((i,fa_i)\),我们将其分为保留子树和删除子树两种类型,对于删除子树,我们在判定其是否合法时候改为判定删除的连通块......
  • VS Code 配置 C/C++ 环境(编译/调试)
    1,VSCode安装点击此处跳转到官网下载安装VSCode2,环境准备这里我们安装VSCode官方推荐的方法安装即可。官方文档。2.1下载MSYS2点击进入MSYS2官网,找到Installation的Downloadtheinstaller:msys2-x86_64-20230318.exe,点击msys2-x86_64-20230318.exe下载。然后根......
  • linux c/c++程序集成python库,实现调用python函数
    为了提高开发效率,扩展开发程序的功能,我们经常会在我们的linuxc/c++进程里调用外部脚本,例如lua、python,下面,介绍下如何在自己的linuxc/c++代码里调用python脚本里的函数和类,并且将python库集成到我们自己的进程目录里,这样就不依赖系统环境是否存在python及其版本要求。 ......
  • C++ STL容器
    vector变长数组,倍增的思想string字符串,substr(),c_str()queue队列,push(),front(),pop()priority_queue优先队列,push(),top(),pop()stack栈,push(),top(),pop()deque双端队......
  • C++中的STL容器和算法
    C++STL(标准模板库)提供了一组丰富的容器和算法,使得开发者能够更加高效地编写程序。本文将介绍STL中的一些常用容器和算法。容器vectorvector是一个动态数组,可以在运行时调整大小。它的优点在于可以快速地访问元素,缺点是在插入和删除元素时需要移动后面的元素。#include<vec......
  • C++-#pargma once
    C++-#pargmaoncehttps://baike.baidu.com/item/%23pragmaonce/9468158?fr=aladdin#pragmaonce是一个比较常用的C/C++预处理指令。只在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。基本信息#pragmaonce是编译器相关的,有的编译器支持,有的编译器不支......
  • C++-std::this_thread::get_id()-获取线程id
    C++-std::this_thread::get_id()-获取线程idstd::this_thread::get_id()头文件:<thread>函数:std::this_thread::get_id()用例:std::thread::idthread_id=std::this_thread::get_id();std::thread对象的成员函数get_id()头文件:<thread>函数:std::thread::idget_id()用例:......
  • C++-改变终端(cout/printf)输出不同颜色的字体-Linux
    C++-改变终端(cout/printf)输出不同颜色的字体-Linuxhttps://blog.csdn.net/qq_41972382/article/details/90311102不同颜色的输出主要依据格式ESC[*m,ESC的八进制为\033,*可以是多个属性的组合,用,隔开。printf#include<iostream>usingnamespacestd;intmain(){print......
  • C++-标准异常`<exception>`
    C++-标准异常<exception>std::exception定义于头文件<exception>classexception;https://www.apiref.com/cpp-zh/cpp/error/exception.html标准库头文件<stdexcept>https://www.apiref.com/cpp-zh/cpp/header/stdexcept.htmlstd::exceptionstd::bad_allocs......