C++基础类型与声明详解
立即解锁
发布时间: 2025-08-16 01:07:29 阅读量: 17 订阅数: 80 


C++编程语言精要与实践指南
# C++ 基础类型与声明详解
## 1. 字符字面量
字符字面量,常被称为字符常量,是用单引号括起来的字符,例如 `'a'` 和 `'0'`。其类型为 `char`,实际上是机器字符集中字符整数值的符号常量。比如在使用 ASCII 字符集的机器上,`'0'` 的值是 48。使用字符字面量而非十进制表示法能让程序更具可移植性。部分字符还有以反斜杠 `\` 作为转义字符的标准名称,例如 `\n` 表示换行,`\t` 表示水平制表符。
宽字符字面量形式为 `L'ab'`,引号间字符的数量和含义依实现而定,以匹配 `wchar_t` 类型,其类型为 `wchar_t`。
## 2. 整数类型
整数类型和 `char` 一样,有三种形式:普通 `int`、有符号 `signed int` 和无符号 `unsigned int`。此外,整数还有三种大小:短整型 `short int`、普通 `int` 和长整型 `long int`,`long int` 也可简称为 `long`,`short` 是 `short int` 的同义词,`unsigned` 是 `unsigned int` 的同义词,`signed` 是 `signed int` 的同义词。
无符号整数类型适合将存储视为位数组的场景。但用 `unsigned` 替代 `int` 以多获得一位来表示正整数通常并非良策,因为隐式转换规则可能会使通过声明变量为 `unsigned` 来确保某些值为正的尝试失败。
与普通 `char` 不同,普通 `int` 始终是有符号的,有符号 `int` 类型只是普通 `int` 对应类型的更明确同义词。
### 2.1 整数字面量
整数字面量有四种形式:十进制、八进制、十六进制和字符字面量。十进制字面量最常用,形式符合预期,如 `0`、`1234`、`976` 等。编译器应对过长而无法表示的字面量发出警告。
以 `0x` 开头的字面量是十六进制(基数为 16)数,以 `0` 开头后接数字的字面量是八进制(基数为 8)数,示例如下:
| 进制 | 示例 |
| ---- | ---- |
| 十进制 | `0`、`2`、`63`、`83` |
| 八进制 | `00`、`02`、`077`、`0123` |
| 十六进制 | `0x0`、`0x2`、`0x3f`、`0x53` |
字母 `a`、`b`、`c`、`d`、`e`、`f` 或其大写形式分别表示 10、11、12、13、14、15。八进制和十六进制表示法在表达位模式时很有用,但用于表达真实数字可能会带来意外结果。例如,在以补码 16 位整数表示 `int` 的机器上,`0xffff` 是十进制负数 -1,若用更多位表示整数,它将是 65535。
后缀 `U` 可用于显式编写无符号字面量,后缀 `L` 可用于显式编写长整型字面量。例如,`3` 是 `int`,`3U` 是 `unsigned int`,`3L` 是 `long int`。若未提供后缀,编译器会根据字面量的值和实现的整数大小为其赋予合适的类型。
建议将非明显常量的使用限制在少数有详细注释的 `const` 或枚举器初始值设定项中。
## 3. 浮点类型
浮点类型用于表示浮点数,和整数一样,有三种大小:单精度 `float`、双精度 `double` 和扩展精度 `long double`。单精度、双精度和扩展精度的确切含义依实现而定。在需要选择精度的问题中,选择合适的精度需要对浮点计算有深入理解。若缺乏这种理解,可寻求建议、花时间学习或使用 `double` 并期望获得最佳结果。
### 3.1 浮点字面量
默认情况下,浮点字面量的类型是 `double`。编译器也应对过大而无法表示的浮点字面量发出警告。以下是一些浮点字面量示例:
```cpp
1.23
.23
0.23
1.
1.0
1.2e10
1.23e-15
```
需注意,浮点字面量中间不能有空格,例如 `65.43 e-21` 不是浮点字面量,而是四个单独的词法标记,会导致语法错误。若要定义 `float` 类型的浮点字面量,可使用后缀 `f` 或 `F`,如 `3.14159265f`、`2.0f`、`2.997925F`。
## 4. 大小
C++ 基本类型的某些方面(如 `int` 的大小)依实现而定。编程时应尽量避免或减少这些依赖的影响,因为编写可移植程序时,这些依赖可能会导致难以发现和修复的错误。
提供多种整数类型、无符号类型和浮点类型的目的是让程序员能利用硬件特性。在许多机器上,不同基本类型在内存需求、内存访问时间和计算速度上存在显著差异。若了解机器,通常能为特定变量选择合适的整数类型,但编写真正可移植的底层代码更具挑战性。
C++ 对象的大小以 `char` 大小的倍数表示,因此 `char` 的大小定义为 1。可使用 `sizeof` 运算符获取对象或类型的大小,基本类型大小有如下保证:
```plaintext
1 ≡ sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long)
1 ≤ sizeof(bool) ≤ sizeof(long)
sizeof(char) ≤ sizeof(wchar_t) ≤ sizeof(long)
sizeof(float) ≤ sizeof(double) ≤ sizeof(long double)
sizeof(N) ≡ sizeof(signed N) ≡ sizeof(unsigned N)
```
其中 `N` 可以是 `char`、`short int`、`int` 或 `long int`。此外,`char` 至少有 8 位,`short` 至少有 16 位,`long` 至少有 32 位,`char` 能容纳机器字符集中的字符。
以下是一个可能的基本类型和示例字符串的图形表示:
```plaintext
'a'
1
756
100000000
&c1
1234567e34
Hello, world!\0
char:
bool:
short:
int:
int*:
double:
char[14]:
```
`char` 类型通常由实现选择为在给定计算机上最适合存储和操作字符的类型,一般是 8 位字节;`int` 类型通常是最适合存储和操作整数的类型,通常是 4 字节(32 位)字。不过,不宜做过多假设,例如有些机器的 `char` 是 32 位。
若需要了解实现的相关依赖方面,可在 `<limits>` 中查找。例如:
```cpp
#include <limits>
int main()
{
cout << "largest float == " << numeric_limits<float>::max()
<< ", char is signed == " << numeric_limits<char>::is_signed << '\n';
}
```
基本类型可在赋值和表达式中自由混合,只要可能,值会被转换以避免信息丢失。若值 `v` 能在类型 `T` 的变量中精确表示,将 `v` 转换为 `T` 是保值的,不会有问题,应尽量避免非保值的转换。
## 5. Void 类型
`void` 类型在语法上是基本类型,但只能作为更复杂类型的一部分使用,不存在 `void` 类型的对象。它用于指定函数不返回值,或作为指向未知类型对象的指针的基类型。例如:
```cpp
void x; // error: there are no void objects
void f(); // function f does not return a value
void* pv; // pointer to object of unknown type
```
声明函数时必须指定返回值的类型。逻辑上,可能期望通过省略返回类型来表示函数不返回值,但这会使语法不规范并与 C 语言的用法冲突,因此使用 `void` 作为“伪返回类型”来表示函数不返回值。
## 6. 枚举
枚举是一种能容纳用户指定值集合的类型,定义后,枚举的使用方式与整数类型类似。可将命名整数常量定义为枚举的成员,例如:
```cpp
enum {ASM, AUTO, BREAK};
```
这定义了三个整数常量(称为枚举器)并为它们赋值。默认情况下,枚举器的值从 0 开始递增,所以 `ASM == 0`,`AUTO == 1`,`BREAK == 2`。枚举也可以命名,如:
```cpp
enum keyword {ASM, AUTO, BREAK};
```
每个枚举都是不同的类型,枚举器的类型是其所属的枚举,例如 `AUTO` 的类型是 `keyword`。声明 `keyword` 类型的变量而非普通 `int`,能为用户和编译器提供关于其预期用途的提示。例如:
```cpp
void f(keyword key)
{
switch (key) {
case ASM:
// do somethin
```
0
0
复制全文
相关推荐










