参考
项目 | 描述 |
---|---|
搜索引擎 | |
C++ Primer Plus (第六版)中文版 | 史蒂芬·普拉达 / 张海龙,袁国忠 译 |
黑马程序员 | C++ |
微软 | C++ 语言文档 |
描述
项目 | 描述 |
---|---|
操作系统 | Windows 10 专业版 |
编辑器 | VScode |
g++ | 8.1.0 |
算术运算符
C++ 所支持的算术运算符有:
项目 | 描述 |
---|---|
+ | 正号、加法运算符 |
- | 负号、减法运算符 |
* | 乘法运算符 |
/ | 除法运算符 |
% | 取模(取余)运算符 |
++ | 自增运算符 |
-- | 自减运算符 |
除法运算
在 C++ 中使用除法运算符时,除法运算符的行为因操作数的不同而不同,具体如下:
- 若两个操作数均为整数,则除法运算的结果将为整数。
- 若两个操作数中存在浮点数,则除法运算的结果将为浮点数。
举个栗子
#include <iostream>
using namespace std;
int main() {
cout << 5 / 3 << endl;
cout << 5.0 / 3 << endl;
cout << 5.0 / 3.0 << endl;
system("pause");
}
执行结果
1
1.66667
1.66667
请按任意键继续. . .
注:
-
除法操作符作用的两个操作数若为整数时,除法运算的结果将为整数。该整数并不是实际计算结果四舍五入后的结果,而是直接去除小数点及小数点后面的部分。
-
在表达式中,除数不能为零。否则,C++ 将抛出错误。
取模运算
取模运算与除法运算的区别在于,除法运算的结果值为两数相除的结果,而取模运算的结果值为两数相除所得到的余数。
举个栗子
#include <iostream>
using namespace std;
int main() {
cout << 5 % 3 << endl;
system("pause");
}
执行结果
2
8
0
请按任意键继续. . .
注:
-
取模运算符的操作数不可为浮点数,仅能为整数。否则,C++ 将抛出错误。
-
取模运算符的操作数中若存在负数,则结果的符号满足如下规则:
A % B = (A / B) * B 。总的来说,取模运算的结果值的符号与 A 的符号相同。
举个栗子
#include <iostream>
using namespace std;
int main() {
cout << -5 % 3 << endl;
cout << 8 % -20 << endl;
cout << -3 % -3 << endl;
cout << -2 % -3 << endl;
system("pause");
}
执行结果
-2
8
0
-2
请按任意键继续. . .
分析
-3 % -3 的结果值为 0 而不是 -0,这是由于对于 Java 来说,+0 与 -0 是相等的。
自增运算符
使用自增运算符可以将类似 a = a + 1 的语句简化为 a++ 或 ++a。其中,a++ 中的 ++ 称为后置自增运算符,++a 中的 ++ 称为前置自增运算符。
前置自增与后置自增的区别在于,两者所作用的操作数自增的时机不同。前置自增的自增时机在包含自增语句的表达式执行完毕前(执行到自增语句时立即完成自增)完成自增,而后置自增的自增时机则在包含自增语句的表达式执行完毕后完成自增。
举个栗子
#include <iostream>
using namespace std;
int main() {
int num = 3;
// 3 * 6 + 3 * 6 = 36
cout << 3 * 6 + num++ * 6 << endl;
num = 3;
// 3 * 6 + 4 * 6 = 42
cout << 3 * 6 + ++num * 6 << endl;
system("pause");
}
执行结果
36
42
请按任意键继续. . .
自减运算符
自减运算符与自增运算符的效果类似,只是自增运算符最终将实现操作数的自增(+1),而自减运算符最终将实现操作数的自减(-1)。
赋值运算符
C++ 支持如下赋值运算符(下表中除 = 运算符之外的所有其他赋值运算符均为复合赋值运算符。):
项目 | 描述 |
---|---|
= | 简单赋值 |
+= | 将第二个操作数的值与第一个操作数的值相加;将结果存储在第一个操作数指定的变量中。 |
-= | 将第二个操作数的值与第一个操作数的值相减;将结果存储在第一个操作数指定的变量中。 |
*= | 将第二个操作数的值与第一个操作数的值相乘;将结果存储在第一个操作数指定的变量中。 |
/= | 将第二个操作数的值与第一个操作数的值相除;将结果存储在第一个操作数指定的变量中。 |
%= | 使用指定的第二个操作数的值对第一个操作数中的值进行取模;将结果存储在第一个操作数指定的变量中。 |
举个栗子
#include <iostream>
using namespace std;
int main() {
// 声明一个整型变量
int num;
// 简单赋值
num = 3;
cout << "【简单赋值】" << num << endl;
// 复合赋值运
cout << num << " += 3\t" << (num += 3) << endl;
cout << num << " -= 3\t" << (num -= 3) << endl;
system("pause");
}
执行结果
【简单赋值】3
3 += 3 6
6 -= 3 3
请按任意键继续. . .
注:
+= 及 -= 运算符的执行优先级要低于 << 运算符,为了使得算术表达式被正常执行,我们在表达式外围添加了 () 以提高表达式的优先级。
比较运算符
比较运算符作用于两个操作数,运算结果为布尔值。C++ 支持如下比较运算符:
项目 | 描述 |
---|---|
== | 判断两个操作数是否相等,若两者相等则运算结果为 true,否则为 false 。 |
!= | 判断两个操作数是否不相等,若两者不相等则运算结果为 true,否则为 false 。 |
> | 判断左操作数是否大于右操作数,若是则运算结果为 true,否则为 false。 |
< | 判断左操作数是否小于右操作数,若是则运算结果为 true,否则为 false。 |
>= | 判断左操作数是否大于或等于右操作数,若是则运算结果为 true,否则为 false。 |
<= | 判断左操作数是否小于或等于右操作数,若是则运算结果为 true,否则为 false。 |
举个栗子
#include <iostream>
using namespace std;
int main() {
cout << (3 > 6) << endl;
cout << (6 >= 6) << endl;
cout << ('3' == 3) << endl;
system("pause");
}
执行结果
0
1
0
请按任意键继续. . .
逻辑运算符
项目 | 描述 | 称呼 | 别称 |
---|---|---|---|
! | 操作数将被隐式转换为 Bool 类型。 如果转换结果为 false,则运算结果为 true;反之,结果为 false。 | 逻辑非 | |
&& | 操作数将被隐式转换为 Bool 类型。如果两个操作数的转换结果均为 true,则运算结果为 true,否则为 false。 | 逻辑与 | 短路与 |
|| | 操作数将被隐式转换为 Bool 类型。如果两个操作数的转换结果中存在 true,则运算结果为 true,否则为 false。 | 逻辑或 | 短路或 |
举个栗子
#include <iostream>
using namespace std;
int main() {
cout << !true << endl;
cout << (true && false) << endl;
cout << (true && true) << endl;
cout << (666 || 0) << endl;
system("pause");
}
执行结果
0
0
1
1
请按任意键继续. . .
注:
在 C++ 中,所有的非零值转换为布尔值的结果均为 true;零转换为布尔值的结果为 false 。
短路
逻辑与运算符仅当第一个操作数的转换结果为 true时,才会计算第二个操作数。
逻辑或运算符仅当第一个操作数的转换结果为 false时,才会计算第二个操作数。
逻辑与运算符的第一个操作数的转换结果为 false 以及 逻辑或运算符的第一个操作数为 true 时,都将发生 短路,即后一个操作数不会被计算。
举个栗子
#include <iostream>
using namespace std;
int main() {
int num = 1;
cout << (true || num++) << endl;
cout << num << endl;
cout << (false && num++) << endl;
cout << num << endl;
system("pause");
}
执行结果
在上述代码执行过程中,变量 num 被初始化为 1 后保存的值未曾发生过改变。原因是逻辑运算过程中发生了短路,num++ 均未被执行。
1
1
0
1
请按任意键继续. . .