首页 > 基础资料 博客日记

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

2024-08-04 23:00:07基础资料围观98

Java资料网推荐「C++系列」C++ 常量知识点-细致讲解这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣

文章目录

一、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++ 变量作用域

文章来源:https://blog.csdn.net/xuaner8786/article/details/140180266
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云