Skip to content

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. 关系运算符

关系运算符用于比较两个值,返回布尔值(truefalse)。

运算符描述示例
==等于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 = ba = b
+=加且赋值a += ba = a + b
-=减且赋值a -= ba = a - b
*=乘且赋值a *= ba = a * b
/=除且赋值a /= ba = a / b
%=取模且赋值a %= ba = a % b
<<=左移且赋值a <<= ba = a << b
>>=右移且赋值a >>= ba = a >> b
&=按位与且赋值a &= ba = a & b
`=`按位或且赋值a |= b
^=按位异或且赋值a ^= ba = 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!~+-*&sizeofnewdelete从右到左
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++ 运算符包括:

  1. 算术运算符+-*/%++--
  2. 关系运算符==!=><>=<=
  3. 逻辑运算符&&||!
  4. 位运算符&|^~<<>>
  5. 赋值运算符=+=-=*=/=%=
  6. 条件运算符?:
  7. sizeof 运算符:获取数据类型或变量的大小
  8. 逗号运算符:从左到右依次计算多个表达式
  9. 成员访问运算符.->
  10. 指针运算符&*

关键概念:

  • 运算符优先级:决定了表达式中运算符的执行顺序
  • 短路求值:逻辑与和逻辑或运算符具有短路求值的特性

掌握运算符是编写 C++ 程序的基础,在后续章节中,我们将学习 C++ 的循环和判断。