简言
什么是运算符?
在C++中运算符其实就是一种功能性符号,用于执行特定的数学或逻辑计算,比如加法、减法、乘法、赋值等。它们可以用于操作变量和值,以执行程序中的不同任务
C++有几种运算符?
- 算数运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 条件运算符(三元运算符)
- 逗号运算符
- 成员访问运算符
- 指针相关运算符
- 其它类型运算符
它们有什么使用规则?
- 运算符在程序执行中会严格遵守运算符的优先级
- 根据运算符的优先级从重到轻依次执行程序运算
- 当两个运算符的优先级相同时将会从左至右执行
算数运算符
用于执行基础的数学计算
#include <iostream>
int main()
{
int Ret;
Ret = 1+1; // 加法 运算符
std::cout<< Ret << std::endl;
Ret = 2-1; // 减法 运算符
std::cout<< Ret << std::endl;
Ret = 4*5; // 乘法 运算符
std::cout<< Ret << std::endl;
Ret = 20/4; // 除法 运算符
std::cout<< Ret << std::endl;
Ret = 7%2; //取模 运算符或称为 求余 运算符,用于计算两个整数相除后的余数
std::cout<< Ret << std::endl;
int ret = 5;
/*
* 自增运算符 - 变量值自动加一
* 自减运算符 - 变量值自动减一
* 自增自减 通常在流程控制语句中常用
*/
++ret; // 右自增 - 先运算 后使用 - 先变成6 然后使用
std::cout<< ret << std::endl;
ret++; // 左自增 - 先使用 后运算 - 先使用 然后变成7
std::cout<< ret << std::endl;
--ret; // 左自减 - 先运算 后使用 - 先变成6 然后使用
std::cout<< ret << std::endl;
ret--; // 右自减 - 先使用 后运算 - 先使用 然后变成5
std::cout<< ret << std::endl;
return 0;
}
关系运算符
用于比较两个值之间的大小
#include <iostream>
int main()
{
bool Ret;
Ret = (5 > 3); // 大于 运算符
std::cout<< Ret << std::endl;
Ret = (5 < 3); // 小于 运算符
std::cout<< Ret << std::endl;
Ret = (5 >= 5); // 大于等于 运算符
std::cout<< Ret << std::endl;
Ret = (5 <= 5); // 小于等于 运算符
std::cout<< Ret << std::endl;
Ret = (5 == 5); //等等于 运算符 - 判断两值是否相等或相同
std::cout<< Ret << std::endl;
Ret = (5 != 3); // 不等于 运算符 - 判断两值是否不等或不同
std::cout<< Ret << std::endl;
return 0;
}
逻辑运算符
用于逻辑判断
#include <iostream>
int main()
{
bool Ret;
Ret = (true && false); // 与 运算符 - 两个条件都为真时结果才为真 - 真真 = 真
std::cout<< Ret << std::endl;
Ret = (true || false); // 或 运算符 - 其中一个条件为真结果就为真 - 真假 / 假真 = 真
std::cout<< Ret << std::endl;
Ret = !(true); // 非 运算符 / 取反符 - 真为假 假为真 - 真 = 假 / 假 = 真
std::cout<< Ret << std::endl;
return 0;
}
位运算符
对整数的二进制位进行操作
#include <iostream>
int main()
{
int Ret;
Ret = (5 & 3); // 按位与 运算符 - 二进制表示为0101 & 0011 = 0001,因此结果为1
std::cout<< Ret << std::endl;
Ret = (5 | 3); // 按位或 运算符 - 二进制表示为0101 | 0011 = 0111,因此结果为7
std::cout<< Ret << std::endl;
Ret = (5 ^ 3); // 按位异或 运算符 - 二进制表示为0101 ^ 0011 = 0110,因此结果为6
std::cout<< Ret << std::endl;
Ret = (~5); // 按位取反 运算符 - 二进制表示为~0101,结果取决于整数的大小和表示方式,通常为负数
std::cout<< Ret << std::endl;
Ret = (5 << 1); // 左移 运算符 - 二进制表示为0101 << 1 = 1010,因此结果为10
std::cout<< Ret << std::endl;
Ret = (5 >> 1); // 右移 运算符 - 二进制表示为0101 >> 1 = 0010,因此结果为2
std::cout<< Ret << std::endl;
return 0;
}
赋值运算符
用于为变量赋值
#include <iostream>
int main()
{
int Ret;
Ret = 5; // 赋值运算符 - 为变量赋值 / 重新赋值
std::cout<< Ret << std::endl;
Ret += 5; // 复合型赋值运算符 - 用变量原来的值加上新值然后重新赋值给变量 Ret = Ret+5;
std::cout<< Ret << std::endl;
Ret -= 3; // 相当于 Ret = Ret - 3;
std::cout<< Ret << std::endl;
Ret *= 2; // 相当于 Ret = Ret * 2;
std::cout<< Ret << std::endl;
Ret /= 2; // 相当于 Ret = Ret / 3;
std::cout<< Ret << std::endl;
Ret %= 3; // 相当于 Ret = Ret % 3;
std::cout<< Ret << std::endl;
Ret <<= 2; // 相当于 Ret = Ret << 2;
std::cout<< Ret << std::endl;
Ret >>= 2; // 相当于 Ret = Ret >> 2;
std::cout<< Ret << std::endl;
Ret &= 3; // 相当于 Ret = Ret & 3;
std::cout<< Ret << std::endl;
Ret ^= 3; // 相当于 Ret = Ret ^ 3;
std::cout<< Ret << std::endl;
Ret |= 3; // 相当于 Ret = Ret | 3;
std::cout<< Ret << std::endl;
return 0;
}
条件运算符(三元运算符)
条件运算符 又称 三元运算符 语法: 条件表达式 ? 表达式1 : 表达式2
这个运算符的工作方式如下:
先计算“条件表达式”的值
如果条件表达式的值为真(即非零),则整个条件运算符的结果是“表达式1”的值。
如果条件表达式的值为假(即零),则整个条件运算符的结果是“表达式2”的值。
#include <iostream>
int main()
{
int a = 5;
int b = 10;
int max = (a > b) ? a : b;
// max会被赋值a与b中最大的值,如果a大于b则 max会被a赋值,如果b大于a则 max会被b赋值
std::cout<< Ret << std::endl;
return 0;
}
逗号运算符
将多个表达式用逗号分隔开 语法: 表达式1, 表达式2, 表达式n
逗号运算符在for循环中经常被使用,特别是在需要同时更新多个变量时
#include <iostream>
int main()
{
for (int i = 0, j = 10; i < j; i++, j--) {
// 定义变量i,j 如果i小于j则i自增否则j自减 - 流程控制 后续会学
std::cout << i << endl;
}
return 0;
}
成员访问运算符
成员访问运算符有两种: 直接访问,指针访问
#include <iostream>
int main()
{
// 在以后学会了类与对象时我们会经常用到 目前先大致了解一下
// 直接访问
Person person;
person.name = "John Doe";
// 指针访问
Person* personPtr = &person;
personPtr->name = "Jane Doe";
return 0;
}
指针相关运算符
指针相关的运算符有三种: 取址运算符、间接寻址运算符、指针算数运算符
指针算术运算只适用于指向同一数组(或连续内存块)的指针。
指针与整数的乘法或除法运算在C++中是不合法的,因为这样的运算没有实际意义。
在进行指针运算时,需要确保指针指向的内存区域是有效的,以避免未定义行为(如访问越界内存)
#include <iostream>
int main()
{
// 取址运算符 - 用于获取变量的内存地址
// 语法: 在变量前加上&运算符,即可得到该变量的地址
int a = 10;
int* ptr = &a; // ptr现在存储了变量a的地址
// 间接寻址运算符 - 也称为解引用运算符,用于访问指针所指向的内存地址中的值
// 语法: 在指针变量前加上*运算符,即可得到指针所指向的值
int a = 10;
int* ptr = &a;
int b = *ptr; // b现在等于a的值,即10
// 指针算数运算符 - 用于移动指针,指向新的内存地址
// 语法: 指针变量加上或减去一个整数,指针将按照指向数据类型的大小移动相应的字节数
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr; // ptr指向arr[0]
ptr++; // ptr现在指向arr[1]
ptr += 2; // ptr现在指向arr[3]
return 0;
}
其它类型运算符
跳出符号外 不在符号中 这里说的其它运算符不一定是运算符,也包含了C++基本库的函数
#include <iostream>
int main()
{
// sizeof函数 - 用于确定变量或数据类型所占用的内存大小(以字节为单位)
// 变量
int a;
std::cout << sizeof(a); // 输出 int 类型所占用的字节数,通常是 4
// 数据类型
std::cout << sizeof(int); // 输出 int 类型所占用的字节数
// 指针
int* p = new int; // 当 sizeof 用于指针时,它返回指针变量所占用的内存大小,而不是指针所指向的内存大小
std::cout << sizeof(p); // 输出指针变量所占用的字节数,通常是 4 或 8,取决于平台
// 数组
int arr[10]; // 当 sizeof 用于数组时,它返回整个数组所占用的内存大小
std::cout << sizeof(arr); // 输出数组 arr 所占用的字节数,通常是 40
}
运算符优先级
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | :: | 范围解析 | 自左向右 |
2 | () 、[] 、. 、-> | 函数调用、数组下标、成员访问 | 自左向右 |
3 | ++ (前缀)、-- (前缀)、+ 、- 、! 、~ 、* 、& 、new 、new[] 、delete 、delete[] 、sizeof 、(类型) | 自增、自减、正负号、逻辑非、按位取反、取地址、类型转换、动态内存分配与释放、大小 | 自右向左 |
4 | * 、/ 、% | 乘法、除法、取余 | 自左向右 |
5 | + 、- | 加法、减法 | 自左向右 |
6 | << 、>> | 按位左移、按位右移 | 自左向右 |
7 | < 、<= 、> 、>= | 小于、小于等于、大于、大于等于 | 自左向右 |
8 | == 、!= | 等于、不等于 | 自左向右 |
9 | & | 按位与 | 自左向右 |
10 | ^ | 按位异或 | 自左向右 |
11 | ` | ` | 按位或 |
12 | && | 逻辑与 | 自左向右 |
13 | ` | ` | |
14 | ?: | 条件运算符(三目运算符) | 自右向左 |
15 | = 、+= 、-= 、*= 、/= 、%= 、&= 、^= 、` | =、 <<=、 >>=` | 赋值运算符及其复合形式 |
16 | throw | 抛出异常 | - |
17 | , | 逗号运算符(用于分隔表达式) | 自左向右 |