在C++中,字面常量(literal constant)即无需定义可以直接写出来的量。字面常量的值一望便知,但是他的数据类型往往不能被准确分辨(尤其是使用auto时)。

我们直接写出来的有确定值的量就是字面常量,如1145143.12'a'1e30等,那么42的类型是什么?3.12是单精度还是双精度?这些都有明确的规定,一个字面常量的类型是由他的形式完全决定的。

1. 整数和浮点数的字面值

整数的字面值

即使没有了解过,也很容易想到114514肯定是int类型。那1145141919呢?超过了int当然就是一个long long类型了。C++里整数常量的类型就是int->long->long long里能表示出它的尺寸最小的类型(显然都是有符号(signed)型)。比如:

  • 2147483547int,而2147483648就是long long类型了,而不是unsigned int
  • 42即使在short范围内,类型也为int而不是short
  • -2147483648int范围内,但是仍然是long long(前面没有提到过负号,实际上-不在字面值之内,先判定了2147483648的类型再取了符号)
  • 1000000000000000000000000如果这个数连long long都装不下怎么办?某些编译器可以继续扩展到128位整数(__int128_t,范围\([-2^{127}, 2^{127})\)),如果更大的话,就不能通过编译了。

不过八进制和十六进制的规则有些不一样。八进制和十六进制常量可以不用负号而表示负数(如0x80000000),这个时候他的类型会被判定为unsigned而不是负值。也就是说,此时按照int->unsigned int->.....->long long->unsigned long long取能表示为正数的最小类型。

浮点数的字面值

shortint的关系类似,虽然float更小,但是double才是我们最常用的浮点数类型。在C++里无论时小数表示还是指数表示,无论有几位有效数字,所有的浮点类型默认都是double(如0.1.098786756451e203E-15)。

手动指定字面值

如果我们需要1个long long类型的0,或者double存不下超长的浮点数,就可以在值的后面加上修饰符,手动指定字面值的类型。

  • uU指定该值为无符号类型,比如2147483648u是一个unsigned int-1U也是一个“无符号的-1”(即4294967295),

  • lL指定类型为longllLL指定类型为long long

    long long a = 3, b = max(a, 0)会出错,因为along long0int导致参数不匹配,修改为b = max(a, 0ll)即可。

    ull可以混用,即ullul表示无符号长整形。

  • fF指定类型为float,指数类型和小数类型都可以(如1e3f0.12F)。

  • lL也可以用于浮点,表示指定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. 布尔字面值

布尔字面值只有两种:truefalse

  • true转化为任意数时值为1,false转化为任意数时值为0
  • 任意非0数转化为bool时,只有原数等于0时变为false,否则都为true(不过浮点数的判定方法有点特殊,由于浮点数的等于是“近似相等”,如果double x=0.1+0.2-0.3,在某些环境下x==0true,但x的实际值由于浮点误差并不为0(非常接近0的一个数),如果有循环if (x) {}将仍然执行,除非x的实际值真的是0(正0或负0),才不会执行)

4. 指针字面值

指针字面值只有一个,那就是空指针nullptr

我们知道nullptrNULL0都可以初始化空指针,其中nullptr是类似truefalse的字面值关键字,而NULL仅仅是定义在头文件里宏,其含义就是“0”,也就是说与0没有区别。

那为什么要专门在C++11里弄一个nullptr呢。因为nullptr是“指针”,而单独存在的0是“int”。类似之前提到的max问题。如果有两个同名函数f(int x)f(int *x),如果传入f(NULL),由于NULL的值为0,就会调用前者,要调用后者,则只能使用f(nullptr)

C++ 字面值常量的类型的更多相关文章

  1. 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)

    十六进制数相等的推断 请问例如以下程序的输出是神马? #include <iostream> #include <string> using namespace std; in ...

  2. c++学习笔记——字面值常量类

    字面值常量类:数据成员都是字面值类型的聚合类是字面值常量类.如果一个类不是聚合类,但是它符合一下要求,则它也是个字面值常量类: 1.数据成员都必须是字面值类型. 2.类必须至少含有一个constexp ...

  3. 字面值常量&&转义序列

    字面值常量举例: 字面值常量的分类 示例 备注 整型 42.024(八进制数).0x23(十六进制) short类型没有对应的字面值 浮点型 3.14.3.14E2(指数) 默认类型是double 字 ...

  4. ios swift 里面关于变量 常量 可选类型 控制流的一些心得

    //swift 里面没有头文件和实现文件.只有一个.swift文件 //swift 里面没有main的概念,程序从main.swift开始执行 //swift 每一条执行语句可以不用分号结束,多条语句 ...

  5. 【c++primer练习】 typedef与指针、常量和类型别名

    # c++primer 61页 typedef char* ptr ; cstr 是一个指向 char 的常量指针, 一种错误的理解是将语句等同于const char* ptr cstr; 但 ptr ...

  6. Java基础(变量数&常量&据类型&类型转换)

    什么是变量: 变量就是一个不固定的数值,它随时会改变,就像银行卡里存的钱一样会变动. 变量的格式:1  数据类型 变量名=变量值:  2  数据类型 变量名: 变量名=变量值: 变量的三大要素:1变量 ...

  7. C 常量的类型

    http://bbs.csdn.net/topics/380028485 整型常量的类型是下列相应表中第一个能表示其值的类型: int --> long int --> long long ...

  8. C#中的常量、类型推断和作用域

    一.常量 常量是其值在使用过程中不会发生变化的变量.在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量: const int a=100;//a的值将不可以改变 常量的特 ...

  9. swift语法之常量 变量 类型

    常量和变量: 在swift中声明变量或者声明常量的时候可以不用写变量或者常量类型 因为系统会自动推导出对应的类型. 变量:可以更改值 swift中每句代码后面不需要加 ; 号 var num = 5 ...

  10. C++ 变量、常量、符号常量

    变量: int i = 0;  // i 是变量 i=5;         //i 可以修改 变量就是程序内一个内存位置的符号名,在该内存位置可以保存数据,并可以通过符号名对该内存地址存放的数据进行访 ...

随机推荐

  1. Apache DolphinScheduler 3.2.2 版本正式发布!

    Apache DolphinScheduler 3.2.2 版本正式发布! 近日,Apache DolphinScheduler 发布了 3.2.2 版本.此版本主要基于 3.2.1 版本进行了 bu ...

  2. Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解

    什么是面向对象编程 (OOP)? OOP 代表面向对象编程. 过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象. 与过程式编程相比,面向对象编程具有以下几个优势: ...

  3. 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)

    2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u1 热҈热҈热҈ #include<bits/stdc++.h> using namespace std; us ...

  4. 卧槽,牛逼!vue3的组件竟然还能“暂停”渲染!

    前言 有的时候我们想要从服务端拿到数据后再去渲染一个组件,为了实现这个效果我们目前有几种实现方式: 将数据请求放到父组件去做,并且使用v-if控制拿到子组件后才去渲染子组件,然后将数据从父组件通过pr ...

  5. 禅道项目管理系统权限绕过漏洞(QVD-2024-15263)

    本文所涉及的任何技术.信息或工具,仅供学习和参考之用,请勿将文章内的相关技术用于非法目的,如有相关非法行为与文章作者无关.请遵守<中华人民共和国网络安全法>. 1. 概述 1.1 基本信息 ...

  6. 模板链表类的扩展(QListEx<T>)

    以前写的链表都是比较简单的,插入节点是在头节点上,所以循环链表时都是从最后一个数据往前找的,给人的感觉是倒着的, 今天写一个在链表尾部插入数据 1.链表节点类的定义 /链表节点类 template & ...

  7. vmware创建虚拟机

    1.vmware创建麒麟虚拟机 选择安装程序光盘映像文件,会最小化安装桌面版本,新的镜像可能识别不到,比如麒麟等. 麒麟系统类似于欧拉,欧拉类似于CentOS,所以我们选择CentOS 修改虚拟机名称 ...

  8. 猜数游戏[USACO2008] Haybale Guessing G

    $ Haybale \ Guessing \ G $ (猜数游戏) 解题报告 \(Diffculty:\) \(\color{purple}省选/NOI-\) 传送门1:(HZOIER) 传送门2:( ...

  9. .net core下使用事件总线

            随着微服务的火热,DDD(领域驱动设计模式)思想风起云涌,冲击着整个软件生态系统.其中,事件总线那是必须知道的了,于是我便抱着一个学习DDD的心态搭建了一个博客网站,目前该网站正在建设 ...

  10. dig 使用

    dig dig(Domain Information Groper)是一个用于 DNS 查询的命令行工具,广泛用于查看域名系统的相关信息. 基本用法 # 查询域名的 A 记录(IPv4 地址): di ...