首页 > 基础资料 博客日记
「C++系列」C++ 常量知识点-细致讲解
2024-08-04 23:00:07基础资料围观98次
一、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. 十六进制整数常量
十六进制整数常量以0x
或0X
开头,后跟0到9的数字以及字母A到F(或a到f,不区分大小写)来表示10到15的值。
int c = 0x1A; // 十六进制整数常量,等价于十进制的26
4. 二进制整数常量(C++14及以后)
从C++14开始,二进制整数常量以0b
或0B
开头,后跟0和1的数字。
int d = 0b11010; // 二进制整数常量,等价于十进制的26
5. 整数常量的类型
整数常量的具体类型(如int
、long
、long long
等)取决于其值的大小以及编译器如何处理这些值。然而,在C++中,可以通过在整数常量后添加特定的后缀来明确指定其类型:
U
或u
表示无符号整数(unsigned
)L
或l
表示长整数(long
)LL
或ll
表示长长整数(long long
)
例如:
unsigned int u = 123U; // 无符号整数
long l = 123456789L; // 长整数
long long ll = 1234567890123456789LL; // 长长整数
注意:尽管U
、L
和LL
后缀可以大写或小写,但出于清晰和一致性的考虑,通常建议使用大写形式。
另外,从C++11开始,还可以使用auto
关键字让编译器自动推断整数常量的类型,但这通常用于变量声明,而不是直接用于整数常量本身。
三、C++ 浮点常量
在C++中,浮点常量(Floating-point constants)是表示带有小数部分的数值的常量。这些常量可以是正数或负数,并且可以用科学记数法(也称为指数表示法)来表示。浮点常量默认是double
类型的,但你可以通过添加特定的后缀来改变它们的类型。
1. 浮点常量的基本形式
浮点常量由整数部分、小数点、小数部分和(可选的)指数部分组成。例如:
float pi = 3.14f; // 注意f后缀表示float类型
double e = 2.71828; // 默认是double类型
2. 科学记数法
科学记数法允许你以底数乘以10的幂次方的形式来表示浮点数。在科学记数法中,e
或E
用作幂的基数10的指示符,后面跟着指数(整数)。例如:
double verySmall = 1.23e-10; // 等价于 1.23 * 10^-10
double veryLarge = 1.23E+20; // 等价于 1.23 * 10^20
3. 浮点常量的类型后缀
f
或F
后缀表示float
类型的浮点常量。l
或L
后缀(在浮点常量中不常见,因为l
和1
容易混淆)在C++中通常用于表示长整型(long
),但在浮点常量中更常见的是l
的大写形式L
(尽管在浮点常量的上下文中,它实际上用于表示long double
类型,而不是long
)。然而,为了避免混淆,建议使用l
的大写形式L
来表示long double
,尽管在浮点常量中直接使用double
(无后缀)或float
(f
/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. 布尔常量的值
布尔常量只有两个可能的值:
- true:表示逻辑真。
- 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
类型的变量isStudent
和isEmployed
,并分别用布尔常量true
和false
进行初始化。然后,我们使用这些变量作为条件表达式来控制程序的输出。
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码)的形式存储在内存中。字符常量可以是普通字符、转义字符或通用字符,并且可以根据需要选择存储在char
或wchar_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
类提供了更强大、更安全的字符串处理能力。
七、相关链接
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: