前言

这一节我们将学习数据类型的相关知识,可能会涉及到一些C++的基本语法,如果你还有不明白的,请到C++基本语法这里温故一下

C++常量

在C++编程语言中,常量指的是那些一旦被设定就不能再改变的值,它们就像是被冻结的数据,始终保持不变。这些值就像是直接写在代码里的字面量,比如数字、字母或者特定的文本。

常量可以是各种基本数据类型,包括:

  1. 整型数字:比如整数123。
  2. 浮点数字:比如带有小数点的数字3.14。
  3. 字符:单个字母或符号,比如’A’或’#’。
  4. 字符串:一系列字符组成的文本,比如”Hello, World!”。
  5. 布尔值:只有两个可能的值,true(真)或false(假)。

注意:常量和变量类似,但关键的区别在于常量一旦被赋予一个值,这个值就不能被改变。这意味着,如果你在程序中声明了一个常量,你就必须在声明时给它一个值,并且在程序的其余部分,这个值是不可更改的。这样的设计可以帮助避免在程序运行过程中意外改变重要的数据,确保程序的稳定性和可靠性。


整数常量

  • 定义:整数常量是没有小数部分的数字,可以是十进制、八进制或十六进制。

  • 进制表示

    • 十进制:直接写数字,比如 85
    • 八进制:以 0 开头,比如 0213
    • 十六进制:以 0x0X 开头,比如 0x4B
  • 后缀:整数常量可以带后缀,表示类型:

    • U:无符号整数(Unsigned)。
    • L:长整数(Long)。
    • 顺序不重要,比如 30U30u 都可以。

示例:

1
2
3
4
5
212         // 合法的十进制整数
215u // 合法的无符号整数
0xFeeL // 合法的十六进制长整数
078 // 非法:8 不是八进制数字
032UU // 非法:不能重复后缀

浮点常量

  • 定义:浮点常量是带小数点的数,或者用科学计数法表示的数。
  • 表示方式
    • 小数形式:同时包含整数部分和小数部分,比如 3.14
    • 指数形式:用 eE 表示,比如 314E-2(等于 3.14)。

注意事项:

  • 小数形式必须包含整数或小数部分,比如 3..141
  • 指数形式必须包含 eE,后面跟一个指数值。

示例:

1
2
3
4
3.14159       // 合法的小数形式
314159E-5L // 合法的指数形式
510E // 非法:缺少指数
.e55 // 非法:缺少整数部分

布尔常量

  • 定义:布尔常量只有两个值,用于表示“真”和“假”:
    • true:表示“真”。
    • false:表示“假”。
  • 注意:虽然 truefalse 在底层分别表示 10,但我们不应该直接把它们当成数字使用。

示例:

1
2
bool isActive = true;
bool isComplete = false;

字符常量

  • 定义:字符常量是用单引号包裹的单个字符,比如 'a'
  • 宽字符
    • 如果以 L 开头(如 L'x'),则表示宽字符,存储在 wchar_t 类型变量中。
  • 窄字符
    • 普通字符(如 'x')存储在 char 类型变量中。

特殊字符(转义序列):

  • 转义字符:用反斜杠 \ 开头,表示特殊含义的字符。
  • 常见转义字符
    转义序列 含义
    \\ 反斜杠 \
    \' 单引号 '
    \" 双引号 "
    \n 换行符
    \t 制表符
    \r 回车符

示例:

1
2
3
4
5
6
7
#include <iostream>
using namespace std;

int main() {
cout << "Hello\tWorld\n";
return 0;
}

输出:

1
Hello   World

字符串常量

  • 定义:字符串常量是用双引号""包裹的一段文本内容。
  • 组成:它可以包含普通字符、特殊字符(通过转义序列如\n表示换行)以及通用字符(如Unicode字符)。

特点

  1. 如何表示字符串

    • 只需要用双引号包裹内容,例如:"Hello, World!"
    • 字符串中可以包含字母、数字、符号,以及通过转义序列表示的特殊字符。
  2. 分行显示字符串

    • 如果字符串太长,可以使用反斜杠\将其分成多行书写,但显示时仍会显示为一行。

示例代码

以下代码展示了如何使用字符串常量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
using namespace std;

int main() {
// 定义一个普通的字符串常量
string greeting = "hello, runoob";
cout << greeting << endl; // 输出字符串并换行

// 定义一个分行的字符串常量
string greeting2 = "hello, \
runoob";
cout << greeting2 << endl; // 显示为一行输出
return 0;
}

输出结果

1
2
hello, runoob
hello, runoob

解释

  1. greeting是一个普通的字符串,直接赋值并输出。
  2. greeting2使用了反斜杠\来分行写字符串,但显示时仍为一行,因为\只是告诉编译器“这是一行字符串,书写上分为了多行”。

小总结

  • 整数常量:表示整数,可以加后缀指定类型,支持十进制、八进制和十六进制。
  • 浮点常量:表示带小数的数,支持小数形式和指数形式。
  • 布尔常量:表示逻辑上的真或假,分别为 truefalse
  • 字符常量:用单引号表示单个字符,支持转义字符表示特殊符号。
  • 字符串常量是用双引号括起来的文本。
  • 如果字符串太长,可以用反斜杠\进行分行,输出时仍显示为一行。
  • 字符串可以包含特殊字符,比如\n表示换行符,\t表示制表符。

以下是对“定义常量”更通俗易懂的解释:


定义常量

  • 如前面所说,常量是值在程序运行过程中不会改变的变量。
  • 在C++中,我们可以通过两种简单的方法定义常量:
    1. 使用#define预处理器。
    2. 使用const关键字。

方法一:使用#define预处理器

  • #define 是一种直接替换文本的工具,在编译前会将程序中所有出现的标识符替换为指定的值。
  • 格式:
    1
    #define 标识符 值

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

#define LENGTH 10 // 定义常量 LENGTH 为 10
#define WIDTH 5 // 定义常量 WIDTH 为 5
#define NEWLINE '\n' // 定义换行符常量

int main() {
int area = LENGTH * WIDTH; // 计算面积
cout << area; // 输出 50
cout << NEWLINE; // 换行
return 0;
}

输出:

1
50

说明:

  • 程序运行前,所有的LENGTH都会被替换为10WIDTH会被替换为5NEWLINE会被替换为换行符。
  • #define没有类型约束,是一种简单直接的方法。

方法二:使用const关键字

  • const 是一种更严格的方式,用于定义带类型的常量。
  • 格式:
    1
    const 数据类型 变量名 = 值;

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main() {
const int LENGTH = 10; // 定义一个整型常量
const int WIDTH = 5; // 定义另一个整型常量
const char NEWLINE = '\n'; // 定义换行符常量

int area = LENGTH * WIDTH; // 计算面积
cout << area; // 输出 50
cout << NEWLINE; // 换行
return 0;
}

输出:

1
50

说明:

  • 使用const定义的常量有类型约束,更加安全。
  • const可以直接参与类型检查,这对大型程序更有帮助。

哪种方式更好?

  • **#define**:

    • 优点:简单直接,没有类型约束。
    • 缺点:在大型项目中,缺乏类型检查,可能会引发难以追踪的错误。
  • **const**:

    • 优点:具有类型约束,更加安全;现代C++中更推荐使用。
    • 缺点:相较于#define,书写稍显繁琐。

编程实践

  • 通常,我们会将常量的名字用大写字母表示,这样可以让代码更容易阅读和维护。
  • 示例:
    1
    const int MAX_SPEED = 120;  // 推荐的命名方式
    通过以上两种方式,你可以选择适合自己需求的方式来定义常量。对于现代C++程序,推荐优先使用const关键字。