Appearance
C++ 运算符
运算符是用于执行特定操作的符号。C++ 提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等。
1. 算术运算符
算术运算符用于执行基本的数学运算。
| 运算符 | 描述 | 示例 |
|---|---|---|
+ | 加法 | a + b |
- | 减法 | a - b |
* | 乘法 | a * b |
/ | 除法 | a / b |
% | 取模(求余) | a % b |
++ | 自增 | a++ 或 ++a |
-- | 自减 | a-- 或 --a |
1.1 基本用法
cpp
#include <iostream>
int main() {
int a = 10;
int b = 3;
std::cout << "a + b = " << a + b << std::endl; // 13
std::cout << "a - b = " << a - b << std::endl; // 7
std::cout << "a * b = " << a * b << std::endl; // 30
std::cout << "a / b = " << a / b << std::endl; // 3(整数除法)
std::cout << "a % b = " << a % b << std::endl; // 1
return 0;
}1.2 自增和自减
cpp
#include <iostream>
int main() {
int a = 10;
// 后缀自增
std::cout << "a++ = " << a++ << std::endl; // 输出: 10,然后 a 变为 11
std::cout << "a = " << a << std::endl; // 输出: 11
// 前缀自增
std::cout << "++a = " << ++a << std::endl; // a 先变为 12,然后输出: 12
std::cout << "a = " << a << std::endl; // 输出: 12
// 后缀自减
std::cout << "a-- = " << a-- << std::endl; // 输出: 12,然后 a 变为 11
std::cout << "a = " << a << std::endl; // 输出: 11
// 前缀自减
std::cout << "--a = " << --a << std::endl; // a 先变为 10,然后输出: 10
std::cout << "a = " << a << std::endl; // 输出: 10
return 0;
}2. 关系运算符
关系运算符用于比较两个值,返回布尔值(true或false)。
| 运算符 | 描述 | 示例 |
|---|---|---|
== | 等于 | a == b |
!= | 不等于 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于等于 | a >= b |
<= | 小于等于 | a <= b |
2.1 基本用法
cpp
#include <iostream>
int main() {
int a = 10;
int b = 20;
std::cout << "a == b: " << (a == b) << std::endl; // 0 (false)
std::cout << "a != b: " << (a != b) << std::endl; // 1 (true)
std::cout << "a > b: " << (a > b) << std::endl; // 0 (false)
std::cout << "a < b: " << (a < b) << std::endl; // 1 (true)
std::cout << "a >= b: " << (a >= b) << std::endl; // 0 (false)
std::cout << "a <= b: " << (a <= b) << std::endl; // 1 (true)
return 0;
}3. 逻辑运算符
逻辑运算符用于组合多个条件,返回布尔值。
| 运算符 | 描述 | 示例 |
|---|---|---|
&& | 逻辑与(AND) | a && b |
| ` | ` | |
! | 逻辑非(NOT) | !a |
3.1 基本用法
cpp
#include <iostream>
int main() {
bool a = true;
bool b = false;
std::cout << "a && b: " << (a && b) << std::endl; // 0 (false)
std::cout << "a || b: " << (a || b) << std::endl; // 1 (true)
std::cout << "!a: " << (!a) << std::endl; // 0 (false)
std::cout << "!b: " << (!b) << std::endl; // 1 (true)
return 0;
}3.2 短路求值
逻辑与和逻辑或运算符具有短路求值的特性:
cpp
#include <iostream>
int main() {
int a = 10;
int b = 20;
// 逻辑与短路求值:如果第一个条件为 false,则不会计算第二个条件
if (a > b && b++ > 0) {
std::cout << "条件成立" << std::endl;
}
std::cout << "b = " << b << std::endl; // b 仍然是 20
// 逻辑或短路求值:如果第一个条件为 true,则不会计算第二个条件
if (a < b || b++ > 0) {
std::cout << "条件成立" << std::endl;
}
std::cout << "b = " << b << std::endl; // b 仍然是 20
return 0;
}4. 位运算符
位运算符用于对整数的二进制位进行操作。
| 运算符 | 描述 | 示例 |
|---|---|---|
& | 按位与 | a & b |
| ` | ` | 按位或 |
^ | 按位异或 | a ^ b |
~ | 按位取反 | ~a |
<< | 左移 | a << n |
>> | 右移 | a >> n |
4.1 基本用法
cpp
#include <iostream>
int main() {
unsigned int a = 60; // 二进制: 0011 1100
unsigned int b = 13; // 二进制: 0000 1101
std::cout << "a & b = " << (a & b) << std::endl; // 12 (0000 1100)
std::cout << "a | b = " << (a | b) << std::endl; // 61 (0011 1101)
std::cout << "a ^ b = " << (a ^ b) << std::endl; // 49 (0011 0001)
std::cout << "~a = " << (~a) << std::endl; // -61 (1100 0011)
std::cout << "a << 2 = " << (a << 2) << std::endl; // 240 (1111 0000)
std::cout << "a >> 2 = " << (a >> 2) << std::endl; // 15 (0000 1111)
return 0;
}5. 赋值运算符
赋值运算符用于给变量赋值。
| 运算符 | 描述 | 示例 | 等价于 |
|---|---|---|---|
= | 简单赋值 | a = b | a = b |
+= | 加且赋值 | a += b | a = a + b |
-= | 减且赋值 | a -= b | a = a - b |
*= | 乘且赋值 | a *= b | a = a * b |
/= | 除且赋值 | a /= b | a = a / b |
%= | 取模且赋值 | a %= b | a = a % b |
<<= | 左移且赋值 | a <<= b | a = a << b |
>>= | 右移且赋值 | a >>= b | a = a >> b |
&= | 按位与且赋值 | a &= b | a = a & b |
| ` | =` | 按位或且赋值 | a |= b |
^= | 按位异或且赋值 | a ^= b | a = a ^ b |
5.1 基本用法
cpp
#include <iostream>
int main() {
int a = 10;
a += 5; // a = a + 5
std::cout << "a += 5: " << a << std::endl; // 15
a -= 3; // a = a - 3
std::cout << "a -= 3: " << a << std::endl; // 12
a *= 2; // a = a * 2
std::cout << "a *= 2: " << a << std::endl; // 24
a /= 4; // a = a / 4
std::cout << "a /= 4: " << a << std::endl; // 6
a %= 4; // a = a % 4
std::cout << "a %= 4: " << a << std::endl; // 2
return 0;
}6. 条件运算符
条件运算符(三元运算符)是 C++ 中唯一的三元运算符。
6.1 基本用法
cpp
#include <iostream>
int main() {
int a = 10;
int b = 20;
int max = (a > b) ? a : b;
std::cout << "最大值: " << max << std::endl; // 20
return 0;
}7. sizeof 运算符
sizeof运算符用于获取数据类型或变量的大小(以字节为单位)。
7.1 基本用法
cpp
#include <iostream>
int main() {
int a = 10;
std::cout << "sizeof(int): " << sizeof(int) << " 字节" << std::endl;
std::cout << "sizeof(a): " << sizeof(a) << " 字节" << std::endl;
std::cout << "sizeof(double): " << sizeof(double) << " 字节" << std::endl;
std::cout << "sizeof(char): " << sizeof(char) << " 字节" << std::endl;
return 0;
}8. 逗号运算符
逗号运算符用于从左到右依次计算多个表达式,返回最后一个表达式的值。
8.1 基本用法
cpp
#include <iostream>
int main() {
int a = 10;
int b = 20;
int c;
c = (a++, b++, a + b);
std::cout << "a = " << a << std::endl; // 11
std::cout << "b = " << b << std::endl; // 21
std::cout << "c = " << c << std::endl; // 32
return 0;
}9. 成员访问运算符
成员访问运算符用于访问类的成员。
9.1 点运算符和箭头运算符
cpp
#include <iostream>
#include <string>
class Student {
public:
std::string name;
int age;
void print() {
std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
}
};
int main() {
Student student;
student.name = "张三";
student.age = 20;
student.print();
Student* ptr = &student;
ptr->name = "李四";
ptr->age = 21;
ptr->print();
return 0;
}10. 指针运算符
指针运算符用于操作指针。
10.1 地址运算符和解引用运算符
cpp
#include <iostream>
int main() {
int a = 10;
int* ptr = &a; // 地址运算符
std::cout << "a 的值: " << a << std::endl;
std::cout << "a 的地址: " << ptr << std::endl;
std::cout << "ptr 指向的值: " << *ptr << std::endl; // 解引用运算符
return 0;
}11. 运算符优先级
运算符优先级决定了表达式中运算符的执行顺序。以下是运算符的优先级(从高到低):
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 1 | :: | 从左到右 |
| 2 | ()、[]、->、.、++、-- | 从左到右 |
| 3 | !、~、+、-、*、&、sizeof、new、delete | 从右到左 |
| 4 | .*、->* | 从左到右 |
| 5 | *、/、% | 从左到右 |
| 6 | +、- | 从左到右 |
| 7 | <<、>> | 从左到右 |
| 8 | <、<=、>、>= | 从左到右 |
| 9 | ==、!= | 从左到右 |
| 10 | & | 从左到右 |
| 11 | ^ | 从左到右 |
| 12 | ` | ` |
| 13 | && | 从左到右 |
| 14 | ` | |
| 15 | ?: | 从右到左 |
| 16 | =、+=、-=、*=、/=、%=等 | 从右到左 |
| 17 | , | 从左到右 |
11.1 示例
cpp
#include <iostream>
int main() {
int a = 10;
int b = 20;
int c = 30;
// 乘法优先级高于加法
int result1 = a + b * c;
std::cout << "a + b * c = " << result1 << std::endl; // 610
// 使用括号改变优先级
int result2 = (a + b) * c;
std::cout << "(a + b) * c = " << result2 << std::endl; // 900
// 关系运算符优先级高于逻辑运算符
bool result3 = a > b && b > c;
std::cout << "a > b && b > c = " << result3 << std::endl; // 0 (false)
return 0;
}12. 示例:综合运用
现在,让我们看一个综合运用各种运算符的例子:
cpp
#include <iostream>
int main() {
int a = 10;
int b = 20;
// 算术运算符
std::cout << "算术运算符:" << 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;
std::cout << "a % b = " << a % b << std::endl;
// 关系运算符
std::cout << "\n关系运算符:" << 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;
// 逻辑运算符
std::cout << "\n逻辑运算符:" << std::endl;
std::cout << "a > b && b > 0: " << (a > b && b > 0) << std::endl;
std::cout << "a < b || b < 0: " << (a < b || b < 0) << std::endl;
std::cout << "!(a > b): " << (!(a > b)) << std::endl;
// 位运算符
std::cout << "\n位运算符:" << 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 << 1 = " << (a << 1) << std::endl;
std::cout << "a >> 1 = " << (a >> 1) << std::endl;
// 赋值运算符
std::cout << "\n赋值运算符:" << std::endl;
int c = a;
c += b;
std::cout << "c += b: " << c << std::endl;
c -= b;
std::cout << "c -= b: " << c << std::endl;
// 条件运算符
std::cout << "\n条件运算符:" << std::endl;
int max = (a > b) ? a : b;
std::cout << "最大值: " << max << std::endl;
// sizeof 运算符
std::cout << "\nsizeof 运算符:" << std::endl;
std::cout << "sizeof(int): " << sizeof(int) << " 字节" << std::endl;
std::cout << "sizeof(a): " << sizeof(a) << " 字节" << std::endl;
// 指针运算符
std::cout << "\n指针运算符:" << std::endl;
int* ptr = &a;
std::cout << "a 的地址: " << ptr << std::endl;
std::cout << "ptr 指向的值: " << *ptr << std::endl;
return 0;
}小结
C++ 运算符包括:
- 算术运算符:
+、-、*、/、%、++、-- - 关系运算符:
==、!=、>、<、>=、<= - 逻辑运算符:
&&、||、! - 位运算符:
&、|、^、~、<<、>> - 赋值运算符:
=、+=、-=、*=、/=、%=等 - 条件运算符:
?: - sizeof 运算符:获取数据类型或变量的大小
- 逗号运算符:从左到右依次计算多个表达式
- 成员访问运算符:
.、-> - 指针运算符:
&、*
关键概念:
- 运算符优先级:决定了表达式中运算符的执行顺序
- 短路求值:逻辑与和逻辑或运算符具有短路求值的特性
掌握运算符是编写 C++ 程序的基础,在后续章节中,我们将学习 C++ 的循环和判断。