一、数据类型
以下是C++数据类型与运算符的详解,结合表格和说明呈现:
1. 基本数据类型
类型 | 大小 (字节) | 取值范围 | 示例 |
---|
bool | 1 | true / false | bool flag = true; |
char | 1 | -128127 或 0255 | char c = 'A'; |
signed char | 1 | -128~127 | signed char sc = -10; |
unsigned char | 1 | 0~255 | unsigned char uc = 200; |
short | 2 | -32,768~32,767 | short s = 100; |
int | 4 (通常) | -2³¹ ~ 2³¹-1 | int i = -5000; |
long | 4 或 8 | -2³¹ ~ 2³¹-1 或 -2⁶³~2⁶³-1 | long l = 100000; |
long long | 8 | -2⁶³ ~ 2⁶³-1 | long long ll = 1e18; |
float | 4 | ±3.4e-38 ~ ±3.4e38 | float f = 3.14f; |
double | 8 | ±1.7e-308 ~ ±1.7e308 | double d = 2.71828; |
void | - | 无值 | void func(); |
注意:
- 具体大小取决于编译器和操作系统(如
int
在16位系统中为2字节)。 - C++11新增:
char16_t
(2字节), char32_t
(4字节) 用于Unicode。
2. 派生数据类型
类型 | 描述 | 示例 |
---|
指针 | 存储内存地址 | int* p = &i; |
数组 | 同类型元素的集合 | int arr[5] = {1,2,3}; |
引用 | 变量的别名(必须初始化) | int& ref = i; |
结构体 | 用户自定义的复合数据类型 | struct Point { int x,y; }; |
类 | 面向对象的核心 | class Student { ... }; |
枚举 | 命名整数常量集合 | enum Color {RED, GREEN}; |
联合体 | 共享内存的不同类型成员 | union Data { int i; float f; }; |
二、C++ 运算符
1. 算术运算符
运算符 | 功能 | 示例 | 结果 |
---|
+ | 加法 | 3 + 2 | 5 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 4 * 5 | 20 |
/ | 除法 | 10 / 3 | 3 (整数除) |
% | 取模 | 10 % 3 | 1 |
++ | 自增 | int a=5; a++; | a=6 |
-- | 自减 | int b=4; --b; | b=3 |
注意:
- 整数除法会截断小数部分(
10/3=3
)。 - 自增/自减分前置(先计算后赋值)和后置(先赋值后计算)。
2. 关系运算符
运算符 | 含义 | 示例 | 结果 |
---|
== | 等于 | 5 == 3 | false |
!= | 不等于 | 5 != 3 | true |
> | 大于 | 5 > 3 | true |
< | 小于 | 5 < 3 | false |
>= | 大于等于 | 5 >= 5 | true |
<= | 小于等于 | 4 <= 3 | false |
3. 逻辑运算符
运算符 | 功能 | 示例 | 结果 |
---|
&& | 逻辑与 | (5>3) && (2<1) | false |
`\ | \ | ` | 逻辑或 |
! | 逻辑非 | !(5>3) | false |
4. 位运算符
运算符 | 功能 | 示例 | 结果(二进制) |
---|
& | 按位与 | 5 & 3 (101 & 011) | 001 (1) |
`\ | ` | 按位或 | `5 \ |
^ | 按位异或 | 5 ^ 3 | 110 (6) |
~ | 取反 | ~5 | 补码形式(如 -6 ) |
<< | 左移 | 5 << 1 | 1010 (10) |
>> | 右移 | 5 >> 1 | 10 (2) |
5. 赋值运算符
运算符 | 等价形式 | 示例 | 效果 |
---|
= | - | a = 5; | 赋值 |
+= | a = a + b | a += 3; | 加后赋值 |
-= | a = a - b | a -= 2; | 减后赋值 |
*= | a = a * b | a *= 4; | 乘后赋值 |
/= | a = a / b | a /= 2; | 除后赋值 |
%= | a = a % b | a %= 3; | 取模后赋值 |
6. 特殊运算符
运算符 | 功能 | 示例 |
---|
? : | 三元条件运算符 | int max = (a>b) ? a : b; |
sizeof() | 返回类型/对象大小 | sizeof(int) → 4 |
, | 逗号运算符(顺序求值) | a = (b=3, b+2); → a=5 |
:: | 作用域解析 | std::cout |
typeid() | 获取类型信息 | typeid(int).name() → "i" |
dynamic_cast | 安全向下转型 | dynamic_cast<Derived*>(base_ptr) |
三、关键概念详解
1. 数据类型转换
转换类型 | 描述 | 示例 |
---|
隐式转换 | 编译器自动进行 | int i = 3.14; → i=3 (截断) |
显式转换 | 强制类型转换 | double d = (double)5/2; → d=2.5 |
C++风格转换 | 更安全的转换方式 | static_cast<double>(5)/2 |
2. 运算符优先级(部分)
优先级 | 运算符 | 结合性 |
---|
1 | :: (作用域) | 左到右 |
2 | ++ , -- , sizeof , ! , ~ | 右到左 |
3 | * , / , % | 左到右 |
4 | + , - | 左到右 |
5 | << , >> | 左到右 |
6 | < , <= , > , >= | 左到右 |
7 | == , != | 左到右 |
12 | && | 左到右 |
13 | `\ | \ |
15 | ? : | 右到左 |
16 | = , += , -= 等赋值运算符 | 右到左 |
口诀:
括号成员第一;全体单目第二;乘除余三,加减四;移位五,关系六;等与不等排第七;位与异或和位或;逻辑与或三二一。
四、示例代码
#include <iostream>
using namespace std;int main() {// 数据类型示例double pi = 3.14159;int truncated = static_cast<int>(pi); // 显式转换: 3// 运算符综合int a = 10, b = 3;int mod = a % b; // 取模: 1bool cmp = (a >= 10); // 比较: trueint bitwise = a << 2; // 左移2位: 40// 三元运算符 也叫 三目运算符string result = (b > 0) ? "Positive" : "Negative";cout << "Mod: " << mod << "\nBitwise: " << bitwise << endl;return 0;
}
五、避坑指南
- 整数溢出:
unsigned char c = 300;
→ 溢出(300 > 255),行为未定义! - 浮点精度陷阱:
0.1 + 0.2 != 0.3
(二进制浮点无法精确表示0.1)。 - 指针野引用:
int* p; *p = 10;
→ 未初始化的指针导致崩溃。 - 运算符优先级混淆:
int x = 5 + 3 * 2;
→ x=11
(乘法优先级高于加法)。
掌握这些核心知识,相当于打通C++内功的“任督二脉”,后续修炼面向对象和模板等高级境界将事半功倍!