C++运算符包括算术、逻辑、位运算等,用于执行计算和操作。算术运算符处理基本数学运算,注意整数除法截断和自增/自减前置后置区别;逻辑运算符支持短路求值,常用于条件判断;位运算符操作二进制位,适用于底层优化。运算符优先级和结合性决定表达式求值顺序,建议用括号明确意图。常见陷阱有整数除法、短路副作用、有符号数位移和赋值与比较混淆,可通过类型转换、避免复杂表达式和编译器警告规避。高级用法包括sizeof获取大小、三元运算符简化条件赋值、逗号运算符串联操作,以及运算符重载实现自定义类型自然操作,提升代码可读性和表达力。

C++的运算符种类繁多,它们是语言执行各种计算和操作的基石。简单来说,它们就是我们用来告诉程序“做点什么”的符号。从最常见的加减乘除,到复杂的位级操作,它们赋予了代码生命力。今天我们主要聊聊算术、逻辑和位运算这几类,它们在日常编程里出镜率极高。
C++的运算符,就像是程序世界的动词,它们指引着数据如何被处理、被转换。
算术运算符:这没什么好说的,小学数学就学了。加法
+
-
*
/
%
5 / 2
2
2.5
++
--
++i
i++
int a = 10, b = 3; int sum = a + b; // 13 int diff = a - b; // 7 int product = a * b; // 30 int quotient = a / b; // 3 (整数除法) int remainder = a % b; // 1 int x = 5; int y = ++x; // x变为6,y为6 int z = x++; // x变为7,z为6
逻辑运算符:这玩意儿主要是用来做条件判断的,在控制流语句(
if
while
&&
||
!
&&
||
!
&&
||
立即学习“C++免费学习笔记(深入)”;
bool isSunny = true;
bool isWarm = false;
if (isSunny && isWarm) { // false
// 不会执行
}
if (isSunny || isWarm) { // true
// 会执行
}
if (!isWarm) { // true
// 会执行
}位运算符:这些操作符是直接作用在整数的二进制位上的。对于我个人而言,这块儿一开始是有点抽象的,但一旦理解了,你会发现它们在处理底层数据、优化性能(比如某些算法)时非常强大。位与
&
|
^
~
<<
>>
unsigned int a = 5; // 二进制 0101 unsigned int b = 3; // 二进制 0011 unsigned int resultAnd = a & b; // 0001 (1) unsigned int resultOr = a | b; // 0111 (7) unsigned int resultXor = a ^ b; // 0110 (6) unsigned int resultNot = ~a; // 1111...1010 (取决于int大小,通常是一个很大的负数或无符号数) unsigned int shiftedLeft = a << 1; // 1010 (10) unsigned int shiftedRight = a >> 1; // 0010 (2)
这就像是数学里的“先乘除后加减”,运算符也有自己的“地位”和“方向”。优先级决定了在没有括号的情况下,哪个运算符先执行。比如,乘法和除法的优先级就高于加法和减法。如果一个表达式里有多个相同优先级的运算符,那就看它们的结合性了。大多数二元运算符(比如加减乘除)都是左结合的,这意味着它们从左到右依次计算。而赋值运算符(
=
a = b = c
b = c
a
理解这些规则至关重要,否则你写出来的代码可能和你想的完全不是一回事。我个人经验是,与其死记硬背那张长长的优先级表,不如记住几个关键点:算术运算符优先级最高(乘除高于加减),然后是位运算符,接着是关系运算符,最后是逻辑运算符,赋值运算符最低。当你不确定或者表达式比较复杂时,最简单也最保险的方法就是:加括号。括号可以强制改变运算顺序,让你的意图清晰明了,也能避免很多潜在的bug。代码的可读性,有时候比所谓的“简洁”更重要。
踩坑是学习的必经之路,运算符也不例外。我见过不少,自己也踩过不少。
一个很经典的坑就是整数除法。前面提过,
5 / 2
2
2.5
static_cast<double>(5) / 2
逻辑运算符的短路求值。这既是优点也是陷阱。如果你在
&&
||
++
if (ptr != nullptr && ptr->doSomething())
ptr
doSomething()
doSomething()
位运算符与有符号数。对有符号数使用位运算符,尤其是右移,结果可能不如你所愿。因为符号位的原因,右移时最高位补0还是补1,取决于具体实现(算术右移还是逻辑右移)。为了避免这种不确定性,通常建议对无符号类型进行位操作。
前置++
++
int i = 0; int j = i++;
int k = ++i;
j
0
i
1
k
1
i
1
++
--
赋值运算符与比较运算符的混淆。这是个老生常谈的问题了,尤其是在C/C++里:
if (a = b)
if (a == b)
b
a
a
除了那些我们每天都在用的算术、逻辑和位运算符,C++还提供了一些特殊或者说“高级”的运算符,以及一个非常重要的概念——运算符重载。
首先,sizeof
sizeof(int)
sizeof(myStruct)
然后是条件运算符(三元运算符)?:
if-else
条件 ? 表达式1 : 表达式2
int x = 10; int y = (x > 5) ? 20 : 30; // y为20
再来是逗号运算符,
int i = (a++, b++);
i
b
a
b
最后,也是C++独有的强大特性:运算符重载(Operator Overloading)。这允许你为自定义类型(比如你定义的类)重新定义现有运算符的行为。比如,你可以让两个
MyVector
+
add()
这些运算符和概念,从底层内存操作到高级的类型行为定制,共同构成了C++强大而灵活的表达能力。掌握它们,你就能更深入地理解代码的运行机制,写出更高效、更优雅的程序。
以上就是C++运算符有哪些种类 算术逻辑位运算说明的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号