1. 运算符和基本类型转换
C++支持的运算符总体来说分为以下几种:
1.1 常用运算符分类
| 运算符类型 | 作用 |
|---|---|
| 算术运算符 | 用于处理四则运算 |
| 赋值运算符 | 用于将表达式的值赋给变量 |
| 比较运算符 | 用于表达式的比较,并返回一个真值或假值 |
| 逻辑运算符 | 用于根据表达式的值返回真值或假值 |
| 逗号运算符 | 取最右边表达式结果 |
| 位运算符 | 用于处理数据的位运算 |
| sizeof运算符 | 用于求字节数长度 |
练习:
cpp
#include<iostream>
int main()
{
std::cout << "sizeof(char) = " << sizeof(char) << std::endl;
std::cout << "sizeof(int) = " << sizeof(int) << std::endl;
std::cout << "sizeof(float) = " << sizeof(float) << std::endl;
std::cout << "sizeof(double) = " << sizeof(double) << std::endl;
return 0;
}1.2 算术运算符
| 运算符 | 术语 | 示例 | 结果 |
|---|---|---|---|
| + | 正号 | +3 | 3 |
| - | 负号 | -3 | -3 |
| + | 加 | 10 + 5 | 15 |
| - | 减 | 10 - 5 | 5 |
| * | 乘 | 10 * 5 | 50 |
| / | 除 | 10 / 5 | 2 |
| % | 取模(取余) | 10 % 3 | 1 |
| ++ | 前自增 | a=2; b=++a; | a=3; b=3; |
| ++ | 后自增 | a=2; b=a++; | a=3; b=2; |
| -- | 前自减 | a=2; b=--a; | a=1; b=1; |
| -- | 后自减 | a=2; b=a--; | a=1; b=2; |
练习:
cpp
#include<iostream>
int main()
{
int a = 0;
int b = 0;
std::cout << "请输入两个值:";
std::cin >> a >> b;
std::cout << a << " + " << b << " = " << a + b << std::endl;
std::cout << a << " - " << b << " = " << a - b << std::endl;
std::cout << a << " * " << b << " = " << a * b << std::endl; // 原文笔误:符号显示为"+"但实际是乘法
std::cout << a << " / " << b << " = " << a / b << std::endl;
std::cout << a << " % " << b << " = " << a % b << std::endl;
return 0;
}注意:除法和取余除数不能为0
cpp
#include<iostream>
int main()
{
int a = 2;
int b = 0;
std::cout << a << " / " << b << " = " << a / b << std::endl; // 导致运行时错误
std::cout << a << " % " << b << " = " << a % b << std::endl; // 导致运行时错误
return 0;
}自增/减注意点:
cpp
#include<iostream>
int main()
{
int a = 2;
int b = 0;
b = ++a;
std::cout << "a = "<< a << ", b = "<< b << std::endl; // 3 3
a = 2;
b = 0;
b = a++;
std::cout << "a = "<< a << ", b = "<< b << std::endl; // 3 2
// 不推荐写法(结果依赖编译器)
a = 2;
b = 0;
b = ++a + a++; // 原文笔误:注释中写的是a++ + ++a
std::cout << "a = "<< a << ", b = "<< b << std::endl; // 4 6
return 0;
}1.3 赋值运算符
| 运算符 | 术语 | 示例 | 结果 |
|---|---|---|---|
| = | 赋值 | a=2; b=3; | a=2; b=3; |
| += | 加等于 | a=0; a+=2; | a=2; |
| -= | 减等于 | a=5; a-=3; | a=2; |
| *= | 乘等于 | a=2; a*=2; | a=4; |
| /= | 除等于 | a=4; a/=2; | a=2; |
| %= | 模等于 | a=3; a%=2; | a=1; |
练习:
cpp
#include<iostream>
int main()
{
int a = 10;
int b = 3;
a += b; // a = 13
a -= b; // a = 10(原文注释:/= 中间不能有空格)
a *= b; // a = 30(原文注释:/= 中间不能有空格)
a /= b; // a = 10
a %= b; // a = 1
return 0;
}1.4 比较运算符
真假性规则: 非0为真,0为假。
| 运算符 | 术语 | 示例 | 结果 |
|---|---|---|---|
| == | 相等于 | 4 == 3 | 0 |
| != | 不等于 | 4 != 3 | 1 |
| < | 小于 | 4 < 3 | 0 |
| > | 大于 | 4 > 3 | 1 |
| <= | 小于等于 | 4 <= 3 | 0 |
| >= | 大于等于 | 4 >= 1 | 1 |
练习:
cpp
#include<iostream>
int main()
{
int a = 4, b = 3;
int c = (a == b); // 0
c = (a = b); // 3(赋值非比较!)
c = (a < b); // 0
c = (a > b); // 0(此时a=b=3)
c = (a <= b); // 1
c = (a >= b); // 1
return 0;
}1.5 逻辑运算符
| 运算符 | 术语 | 示例 | 结果规则 |
|---|---|---|---|
| ! | 非 | !a | a假则1,a真则0 |
| && | 与 | a && b | a和b均为真时结果为1,否则0 |
| || | 或 | a || b | a或b至少一个为真时结果为1,两者均假则0 |
练习:
cpp
#include<iostream>
int main()
{
int a = 4, b = 0;
bool c = !a; // 0
c = !b; // 1
c = (a != 0) && (a >= b); // 1
c = (b != 0) && (a >= b); // 0
c = (a != 0) \|\| (a == b); // 1
c = (b != 0) \|\| (a == b); // 0
return 0;
}1.6 逗号操作符
规则: 取最后一个表达式的值
示例:
cpp
#include <iostream>
int main()
{
int a = 10, b = 20, c = 0;
c = (a + 1, a + b, a - b); // c = -10
return 0;
}1.7 位运算符
| 符号 | 名称 | 运算规则 |
|---|---|---|
| & | 按位与 | 同1为1 |
| | | 按位或 | 有1为1 |
| ^ | 按位异或 | 不同为1 |
| ~ | 按位取反 | 0变1,1变0 |
| << | 按位左移 | 乘以2的n次方 |
| >> | 按位右移 | 除以2的n次方 |
1.7.1 按位与
cpp
9 & 8 = 8 (1001 & 1000 = 1000)
9 & 4 = 0 (1001 & 0100 = 0000)1.7.2 按位或
cpp
9 | 5 = 13 (1001 | 0101 = 1101)1.7.3 按位异或
规律:
- 相同数异或为0(5^5=0)
- 顺序无关(3^4^5 = 3^5^4 = 2)
- a^b^b = a
交换变量值:
cpp
a = a ^ b;
b = b ^ a; // b = a
a = a ^ b; // a = b1.7.4 按位取反
cpp
~9 = -10 // 二进制取反后按补码计算1.7.5 按位左移
cpp
2 << 2 = 8 // 可能改变符号位1.7.6 按位右移
cpp
15 >> 3 = 1 // 正数补0
-15 >> 3 = -2 // 负数补1(依赖编译器)1.8 三目运算符
格式: 表达式1 ? 表达式2 : 表达式3
示例:
cpp
#include <iostream>
int main()
{
int a=10, b=20;
int max = (a > b) ? a : b;
// 嵌套判断
(a >= 0) ?
((a == 0) ? std::cout << "0" : std::cout << "正数") :
std::cout << "负数";
return 0;
}1.9 运算符优先级
从高到低:
[]().->-(负号)~++--*(指针)&!(类型)sizeof*/%+-<<>>>>=<<===!=&(位与)^|&&||?:=+=-=等赋值运算符,
1.10 类型转换
1.10.1 隐式转换
cpp
int a = 1 / 2; // 0(整型除法)
double d1 = 1 / 2; // 0.0(整型除法后转double)
double d2 = 1.0 / 2; // 0.5(提升为double后计算)1.10.2 强制转换
cpp
double b = 2.3;
int a = (int)b; // 2(直接截断小数)四舍五入练习:
cpp
#include <iostream>
int main()
{
float num;
std::cin >> num;
std::cout << (int)(num + 0.5); // +0.5后截断
return 0;
}2. 错误调试指南
2.1 代码保存
- 文件名左上角出现
*表示未保存 - VS2022编译时自动保存
2.2 main函数拼写错误
- 错误提示:"main函数不存在"
2.3 中英文符号错误
- 红色下划线标识错误位置
- 双击错误列表快速定位
2.4 标识符未定义
- 编译报错:"未声明的标识符"
2.5 括号/花括号不匹配
- 错误提示:"缺少
}"或"缺少)"
2.6 其他异常
- 逐步注释代码定位崩溃行
附:文档中存在的笔误说明(非原文内容,仅为说明):
- 算术运算符表格中乘法符号误写为
+ - 赋值运算符表格中
-=误标为<= - 按位或运算符符号原文用
!,实际应为| - 部分代码注释与实际运算不符(如自增示例)
- 位取反示例中二进制表示不完整
