「C++系列」C++ 常量知识点-细致讲解

news2024/12/26 10:45:45

文章目录

  • 一、C++ 常量定义
    • 1. 使用`#define`预处理指令
    • 2. 使用`const`关键字
    • 3. 局部常量
    • 4. 全局常量
    • 5. 指针常量
    • 6. 枚举(Enumerations)
    • 7. constexpr(C++11及以后)
  • 二、C++ 整数常量
    • 1. 十进制整数常量
    • 2. 八进制整数常量
    • 3. 十六进制整数常量
    • 4. 二进制整数常量(C++14及以后)
    • 5. 整数常量的类型
  • 三、C++ 浮点常量
    • 1. 浮点常量的基本形式
    • 2. 科学记数法
    • 3. 浮点常量的类型后缀
    • 4. 示例
    • 5. 注意
  • 四、C++ 布尔常量
    • 1. 布尔常量的类型
    • 2. 布尔常量的值
    • 3. 布尔常量的使用
    • 4. 布尔常量的内存占用
    • 5. 示例代码
    • 6. 总结
  • 五、C++ 字符常量
    • 1. 字符常量的基本形式
    • 2. 字符常量的类型
    • 3. 字符常量的表示
    • 4. 字符常量的存储
    • 5. 示例
    • 6. 注意事项
  • 六、C++ 字符串常量
    • 1. 字符串常量的定义
    • 2. 字符串常量的存储
    • 3. 字符串常量的使用
    • 4. 字符串常量与字符数组的区别
    • 5. 字符串常量与C++标准库中的`std::string`
    • 6. 注意事项
  • 七、相关链接

一、C++ 常量定义

在C++中,常量(Constant)是指其值在程序执行期间不可改变的量。常量可以是整数、浮点数、字符或字符串等类型。使用常量可以提高程序的可读性和可维护性,因为它们提供了一种方式来为程序中使用的特定值命名,这样当需要更改这些值时,就只需在定义常量的地方进行修改,而无需在代码中搜索并替换所有出现的值。

1. 使用#define预处理指令

这是C和C++中都支持的一种定义常量的方式,但它实际上是在预处理阶段进行的文本替换,而不是真正的常量。

#define PI 3.14159

2. 使用const关键字

const关键字用于声明一个常量。与#define不同,const常量有类型,并且遵循作用域和链接性规则。

const double pi = 3.14159;

3. 局部常量

在函数内部定义的const常量是局部的,只在该函数内部可见。

void func() {
    const int localConst = 10; // 局部常量
}

4. 全局常量

在函数外部定义的const常量是全局的,可以在整个程序中访问。

const double GlobalPi = 3.14159;

void func() {
    // 可以访问GlobalPi
}

5. 指针常量

可以创建指向常量的指针(指针指向的值不能通过该指针修改)和常量指针(指针本身的值不能修改,但指向的值可以修改)。

  • 指向常量的指针:
const int* ptr = &x; // ptr指向的值不能通过ptr修改
  • 常量指针:
int* const ptr = &x; // ptr本身的值(即ptr指向的地址)不能修改
  • 指向常量的常量指针(两者都不能修改):
const int* const ptr = &x;

6. 枚举(Enumerations)

枚举类型也可以用于定义一组命名的常量。

enum Color {RED, GREEN, BLUE};

Color myColor = RED; // 使用枚举常量

7. constexpr(C++11及以后)

constexpr关键字用于声明编译时常量,即其值在编译时就能确定的常量。constexpr变量可以用在需要常量的任何场合,包括数组大小、模板参数等。

constexpr int maxArraySize = 100;
int myArray[maxArraySize]; // 使用constexpr常量作为数组大小

constexpr还可以用于函数,表示该函数在编译时就能计算出其返回值。

constexpr int square(int x) {
    return x * x;
}

constexpr int result = square(5); // 在编译时计算并确定result的值

二、C++ 整数常量

在C++中,整数常量是表示整数值的常量,它们在编译时就已经确定了具体的整数值,并且在程序的执行过程中不会改变。整数常量可以是十进制、八进制、十六进制或二进制(C++14及以后版本支持二进制字面量)表示的。

1. 十进制整数常量

十进制整数常量是最常见的,它们不包含前缀,并且由0到9的数字组成。

int a = 123; // 十进制整数常量

2. 八进制整数常量

八进制整数常量以数字0开头,后跟0到7的数字。

int b = 077; // 八进制整数常量,等价于十进制的63

注意:在C++中,八进制字面量已经不再推荐使用(尽管仍然有效),因为它们的表示方式可能会与某些十进制字面量混淆。

3. 十六进制整数常量

十六进制整数常量以0x0X开头,后跟0到9的数字以及字母A到F(或a到f,不区分大小写)来表示10到15的值。

int c = 0x1A; // 十六进制整数常量,等价于十进制的26

4. 二进制整数常量(C++14及以后)

从C++14开始,二进制整数常量以0b0B开头,后跟0和1的数字。

int d = 0b11010; // 二进制整数常量,等价于十进制的26

5. 整数常量的类型

整数常量的具体类型(如intlonglong long等)取决于其值的大小以及编译器如何处理这些值。然而,在C++中,可以通过在整数常量后添加特定的后缀来明确指定其类型:

  • Uu 表示无符号整数(unsigned
  • Ll 表示长整数(long
  • LLll 表示长长整数(long long

例如:

unsigned int u = 123U; // 无符号整数
long l = 123456789L; // 长整数
long long ll = 1234567890123456789LL; // 长长整数

注意:尽管ULLL后缀可以大写或小写,但出于清晰和一致性的考虑,通常建议使用大写形式。

另外,从C++11开始,还可以使用auto关键字让编译器自动推断整数常量的类型,但这通常用于变量声明,而不是直接用于整数常量本身。

三、C++ 浮点常量

在C++中,浮点常量(Floating-point constants)是表示带有小数部分的数值的常量。这些常量可以是正数或负数,并且可以用科学记数法(也称为指数表示法)来表示。浮点常量默认是double类型的,但你可以通过添加特定的后缀来改变它们的类型。

1. 浮点常量的基本形式

浮点常量由整数部分、小数点、小数部分和(可选的)指数部分组成。例如:

float pi = 3.14f; // 注意f后缀表示float类型
double e = 2.71828; // 默认是double类型

2. 科学记数法

科学记数法允许你以底数乘以10的幂次方的形式来表示浮点数。在科学记数法中,eE用作幂的基数10的指示符,后面跟着指数(整数)。例如:

double verySmall = 1.23e-10; // 等价于 1.23 * 10^-10
double veryLarge = 1.23E+20; // 等价于 1.23 * 10^20

3. 浮点常量的类型后缀

  • fF 后缀表示float类型的浮点常量。
  • lL 后缀(在浮点常量中不常见,因为l1容易混淆)在C++中通常用于表示长整型(long),但在浮点常量中更常见的是l的大写形式L(尽管在浮点常量的上下文中,它实际上用于表示long double类型,而不是long)。然而,为了避免混淆,建议使用l的大写形式L来表示long double,尽管在浮点常量中直接使用double(无后缀)或floatf/F后缀)更为常见。
  • 默认情况下,没有后缀的浮点常量是double类型的。

4. 示例

float smallPi = 3.14f; // float类型
double bigPi = 3.141592653589793; // 默认double类型
long double veryAccuratePi = 3.14159265358979323846L; // long double类型

// 使用科学记数法
double smallNumber = 4.56e-10; // 4.56乘以10的-10次方
double largeNumber = 1.23E+20; // 1.23乘以10的20次方

5. 注意

  • 当你在处理非常大的数或需要高精度的计算时,应该考虑使用long double类型,尽管它的精度和范围仍然受到编译器和底层硬件的限制。
  • 浮点数的表示和计算可能会引入舍入误差,因此在进行需要高精度的计算时(如金融计算),可能需要使用专门的库(如GMP)或算法来避免这些问题。

四、C++ 布尔常量

在C++中,布尔常量(Boolean Constants)是表示逻辑真(true)或逻辑假(false)的常量。它们是C++语言中的基本数据类型之一,用于在程序中表示逻辑条件。以下是关于C++布尔常量的详细解释:

1. 布尔常量的类型

布尔常量是bool类型的,这是C++中用于表示真假的标准数据类型。bool类型源自布尔逻辑,由英国数学家George Boole发明。

2. 布尔常量的值

布尔常量只有两个可能的值:

  1. true:表示逻辑真。
  2. false:表示逻辑假。

这两个值都是C++中的关键字,用于在程序中直接表示逻辑条件。

3. 布尔常量的使用

布尔常量广泛用于控制程序的流程,如在条件语句(如if语句、while循环等)中作为条件表达式。它们还可以作为函数的返回值或参数,以及存储在bool类型的变量中。

4. 布尔常量的内存占用

C++标准并没有规定bool类型需要占用的内存大小,这是实现定义的行为。然而,在大多数现代编译器中,bool类型通常用一个字节来存储,尽管它实际上只需要一个二进制位(bit)来表示真或假。编译器可能会通过位字段(bit-field)或位操作来优化bool类型的存储。

5. 示例代码

以下是一个简单的示例,展示了如何在C++程序中使用布尔常量:

#include <iostream>

int main() {
    bool isStudent = true; // 声明一个bool类型的变量isStudent,并初始化为true
    if (isStudent) { // 使用布尔常量true作为条件
        std::cout << "You are a student." << std::endl;
    } else {
        std::cout << "You are not a student." << std::endl;
    }

    bool isEmployed = false; // 声明另一个bool类型的变量isEmployed,并初始化为false
    if (!isEmployed) { // 使用布尔常量false的否定形式作为条件
        std::cout << "You are not employed." << std::endl;
    }

    return 0;
}

在这个示例中,我们声明了两个bool类型的变量isStudentisEmployed,并分别用布尔常量truefalse进行初始化。然后,我们使用这些变量作为条件表达式来控制程序的输出。

6. 总结

C++中的布尔常量是表示逻辑真(true)和逻辑假(false)的常量,它们是bool类型的基本值。布尔常量在程序设计中扮演着重要角色,特别是在控制程序流程和逻辑判断方面。

五、C++ 字符常量

在C++中,字符常量(Character Constants)是指用单引号'括起来的一个字符。它们代表了一个具体的字符值,在内存中通常以ASCII码(或Unicode码,取决于编译器和程序设置)的形式存储。以下是对C++字符常量的详细解释:

1. 字符常量的基本形式

字符常量直接用单引号括起一个字符,如'A''0''&'等。需要注意的是,单引号'是字符的界限符,不属于字符常量的一部分。因此,''(两个单引号之间没有任何字符)是非法的,而'\''(在单引号内使用转义字符\来表示单引号本身)是合法的。

2. 字符常量的类型

在C++中,字符常量通常被存储在char类型的变量中。然而,如果字符常量以L(仅当大写时)开头,则表示它是一个宽字符常量(Wide Character Constant),此时它必须存储在wchar_t类型的变量中。宽字符常量用于支持更广泛的字符集,如Unicode。

3. 字符常量的表示

  • 普通字符:如'a''B''0'等,直接表示一个可见的字符。
  • 转义字符:以反斜线\开头,后跟一个或几个字符序列表示的字符称为转义字符。它们用于表示ASCII字符集中不可打印或不方便输入的控制字符和其他特定功能的字符。例如,\n表示换行符,\t表示水平制表符。
  • 通用字符:从C++11开始,可以使用\u\U前缀后跟十六进制数来表示Unicode字符,如'\u0041'表示大写字母A(等同于'A'),'\U00000041'也表示同样的字符。

4. 字符常量的存储

在内存中,字符常量以ASCII码(或Unicode码)的形式存储,每个字符占1个字节(对于ASCII字符)或更多字节(对于Unicode字符,具体取决于编码方式和字符本身)。需要注意的是,字符串常量(即用双引号括起来的字符序列)在内存中的存储会略有不同,它们会在末尾添加一个\0(空字符)作为结尾标记。

5. 示例

#include <iostream>

int main() {
    char ch1 = 'A'; // 普通字符常量
    char ch2 = '\n'; // 转义字符常量,表示换行
    wchar_t wch = L'你'; // 宽字符常量,表示Unicode字符'你'

    std::cout << ch1 << std::endl; // 输出A
    std::cout << "Hello, World!\n"; // 字符串常量,包含转义字符\n

    return 0;
}

6. 注意事项

  • 字符常量只能包含一个字符(转义字符除外),如'AB'是非法的。
  • 字符常量区分大小写,'A''a'是不同的字符常量。
  • 在使用宽字符常量时,必须确保编译器和程序环境支持Unicode或相应的宽字符集。

综上所述,C++中的字符常量是表示单个字符的常量,它们以单引号括起,并以ASCII码(或Unicode码)的形式存储在内存中。字符常量可以是普通字符、转义字符或通用字符,并且可以根据需要选择存储在charwchar_t类型的变量中。

六、C++ 字符串常量

在C++中,字符串常量是由双引号""括起来的一个或多个字符组成的序列。它们具有一些特定的特性和行为,以下是对C++字符串常量的详细解释:

1. 字符串常量的定义

  • 字符串常量是由双引号括起来的字符序列,如"Hello, World!"
  • 它们表示的是一系列字符的集合,而不是单个字符。

2. 字符串常量的存储

  • 在C++中,字符串常量通常被存储在程序的只读数据段(也称为常量区或静态数据区)中。这意味着一旦程序被加载到内存中,字符串常量的内容就不会被修改。
  • 字符串常量在内存中以字符数组的形式存储,并在末尾自动添加一个空字符'\0'作为字符串的结束标志。

3. 字符串常量的使用

  • 在C++中,字符串常量不能直接赋值给字符数组(除非使用特定的编译器扩展或C风格的字符串操作),但可以通过指针来引用它们。
  • 由于字符串常量存储在常量区,因此可以通过指向常量的指针(const char*)来引用它们,以避免尝试修改常量内容的错误。
  • 示例代码:
const char* str = "Hello, World!";
// 正确:通过指向常量的指针引用字符串常量
// str[0] = 'h'; // 错误:这将导致编译错误,因为str是指向常量的指针

4. 字符串常量与字符数组的区别

  • 字符串常量是存储在常量区的,而字符数组则是可以在栈上或堆上分配的,其内容可以在运行时被修改。
  • 字符串常量在程序中可能只存在一份拷贝(由于字符串常量池的优化),而每个字符数组都有自己独立的内存空间。

5. 字符串常量与C++标准库中的std::string

  • C++标准库中的std::string类提供了一个更灵活、更安全的字符串表示方式。与字符串常量不同,std::string对象可以动态地增长和缩小,并且可以包含空字符(因为std::string通过长度来管理字符串,而不是通过空字符来终止)。
  • 使用std::string可以更方便地进行字符串的拼接、查找、替换等操作,并且可以避免许多与C风格字符串相关的错误和陷阱。

6. 注意事项

  • 尝试修改字符串常量的内容(即使是通过非const指针)是未定义行为,可能导致程序崩溃或数据损坏。
  • 在使用字符串常量时,应注意避免内存泄漏和缓冲区溢出等安全问题。

C++中的字符串常量是由双引号括起来的字符序列,它们存储在常量区中,并以字符数组的形式表示,末尾添加空字符作为结束标志。在使用时,应通过指向常量的指针来引用它们,并避免尝试修改其内容。同时,C++标准库中的std::string类提供了更强大、更安全的字符串处理能力。
在这里插入图片描述

七、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型
  7. 「C++系列」C++ 变量作用域

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RAG理论:ES混合搜索BM25+kNN(cosine)以及归一化

接前一篇:RAG实践:ES混合搜索BM25+kNN(cosine) https://blog.csdn.net/Xin_101/article/details/140230948 本文主要讲解混合搜索相关理论以及计算推导过程, 包括BM25、kNN以及ES中使用混合搜索分数计算过程。 详细讲解: (1)ES中如何通过BM25计算关键词搜索分数; (2)…

Postman使用指南①网页版使用

postman官网地址&#xff1a;Postman API Platform 进入后点击右上角免费注册&#xff0c;注册后登录 登录之后即可在网页使用&#xff0c;无需下载

static的理论学习

在说到static之前&#xff0c;需要先明确变量类型&#xff1a; 而在聊到变量类型之前我们可以将变量的两个属性好好学一学 变量的两个属性 作用域&#xff08;scope&#xff09;&#xff1a; 从内存的角度来看&#xff0c;就是变量存放在栈&#xff08;stack&#xff09;中&…

最新版Python安装教程

一、安装Python 1.下载Python 访问Python官网&#xff1a; https:/www.oython.orgl 点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS./Linux等) 选择下载最新稳定版本的Python 以下内容以演示安装Windows操作系统64位的python 左边是稳定发布版本Stabl…

6000字以上论文参考:基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

可参考&#xff1a;基于JavaSpringMvcVue技术的实验室管理系统设计与实现&#xff08;6000字以上论文参考&#xff09;-CSDN博客 论文参考&#xff1a;

算法day03 桶排序 数据结构分类 时间复杂度 异或运算

学数据结构之前 必看_哔哩哔哩_bilibili 1.认识复杂度和简单排序算法_哔哩哔哩_bilibili 桶排序&#xff08;Bucket sort&#xff09;------时间复杂度为O(n)的排序方法&#xff08;一&#xff09;_多桶排序时间复杂度-CSDN博客 桶排序 测试场景&#xff1a;数组中有10000个随…

【Excel】输入内容自动添加边框线

1. 选中表格区域 → 新建条件规则 2. 设置公式 3. 设置格式 测试生效

[激光原理与应用-100]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 4 - 3C电池行业应用 - 不同的电池类型、焊接方式类型

目录 前言&#xff1a; 一、激光在3C行业的应用概述 1.1 概述 1.2 激光焊接在3C-电池行业的应用 1.3 动力电池的激光焊接工艺 1.3.1 概述 1.3.2 动力电池常见的焊接应用 1.电池壳体与盖板焊接 2.电池防爆阀密封 焊接 二、不同的电池的外形 2.1 软包锂电池 2.1.1 概述…

数字传输系统的演变与应用

引言 在现代通信网络中&#xff0c;数字传输系统扮演着至关重要的角色。本文将用简单易懂的语言&#xff0c;向初学者介绍PCM速率体制、SONET/SDH以及光网络&#xff0c;让大家更好地理解这些技术。 2.5.1 PCM速率体制 数字传输系统简介 在早期电话网络中&#xff0c;用户电话…

基于S32K144驱动NSD8381

文章目录 1.前言2.芯片介绍2.1 芯片简介2.2 硬件特性2.3 软件特性 3.测试环境3.1 工具3.2 架构 4.软件驱动4.1 SPI4.2 CTRL引脚4.3 寄存器4.4 双极性步进电机驱动流程 5.测试情况6.参考资料 1.前言 最近有些做电磁阀和调光大灯的客户需要寻找国产的双极性步进电机驱动&#xf…

qemu模拟orangepi

前言 由于qemu目前只支持orange pipc单板&#xff0c;也就是H3型号&#xff0c;故我们就拿这个型号做测试 环境搭建 linux主机环境 我这里采用win10 WSL&#xff0c;且环境用的是openeuler的&#xff0c;在选择服务器类型可以按照自己喜好选择&#xff0c;也就是包安装方式…

玉石风能否接棒黏土风?一探AI绘画新风尚

在数字艺术的浪潮中,AI绘画平台以其独特的创造力和便捷性,正在逐步改变我们对艺术的传统认知。从黏土风的温暖质感到琉璃玉石的细腻光泽,每一次风格的转变都引领着新的潮流。今天,我们将聚焦玉石风,探讨它是否能成为下一个流行的艺术滤镜,并提供一种在线体验的方式,让你…

SUSAN

1995年英国牛津大学的S.M.Smith提出了一种新的图像边缘检测算法SUSAN算法,不同于以前经典边缘检测算法,SUSAN算法基于灰度相似性比较,采用圆形模板,对图像进行灰度差统计,无需计算方向导数,而且具备积分特性,它简单而且有效,适用于图像中边缘和角点的检测,可以去除图像…

CISC和RISC指令集

文章目录 1. 指令集 2. CISC&#xff08;复杂指令集计算&#xff09; 3. RISC&#xff08;精简指令集计算&#xff09; 4. RISC的设计初衷 5. CISC和RISC流程对比 CISC&#xff08;复杂指令集计算&#xff09;的实现 RISC&#xff08;精简指令集计算&#xff09;的实现 …

Bug记录:【com.fasterxml.jackson.databind.exc.InvalidDefinitionException】

bug记录 序列化错误 异常com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 完整错误(主要是FAIL_ON_EMPTY_BEANS) 00:15:20.250 [http-nio-3000-exec-1] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - S…

【教程】新的Selenium!整合了隐藏浏览器指纹等功能

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 前景提要 driver Driver() 常用driver 接口 最后的话 前景提要 新的selenium&#xff0c;整合了隐藏浏览器指纹&#xff0c;非常好用&#x…

【Linux】网络新手村

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 今天&#xff0c;我们就开始学习Linux网络相关的内容。这篇博客作为Linux网络板块的第一篇博客看&#xff0c;我们首先要带着大家明白Linux网络的一些名词的概念&#xff0c;为之后的学习扫清障碍。然后我…

基于CS模型和CV模型的多目标协同滤波跟踪算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于CS模型和CV模型的多目标协同滤波跟踪算法matlab仿真,在计多目标跟踪领域&#xff0c;基于CS模型和CV模型的多目标协同滤波跟踪算法是近年来发展起来的先进技术…

HackTheBox--Headless

Headless测试过程 1 信息收集 NMAP端口扫描 nmap -sSCV 10.10.11.85000端口测试 检查页面功能&#xff0c;请求 For questions 功能&#xff0c;跳转到 /support 目录 目录扫描 发现 /dashboard 目录 访问 /dashboard 目录&#xff0c;显示未认证&#xff0c;如果通过认证…

Postgresql - 用户权限数据库

1、综述 在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、部门、角色、菜单这几个部分展…