Appearance
运算符
运算符用于执行各种运算操作。C++提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符等。本章将详细介绍C++中的各类运算符。
算术运算符
cpp
#include <iostream>
using namespace std;
int main() {
// ============ 基本算术运算符 ============
int a = 10, b = 3;
// 加法运算符 +
int sum = a + b;
cout << a << " + " << b << " = " << sum << endl; // 13
// 减法运算符 -
int diff = a - b;
cout << a << " - " << b << " = " << diff << endl; // 7
// 乘法运算符 *
int product = a * b;
cout << a << " * " << b << " = " << product << endl; // 30
// 除法运算符 /
int quotient = a / b;
cout << a << " / " << b << " = " << quotient << endl; // 3(整数除法)
// 取模运算符 %(求余数)
int remainder = a % b;
cout << a << " % " << b << " = " << remainder << endl; // 1
// ============ 整数除法与浮点除法 ============
int x = 7, y = 2;
// 整数除法:结果为整数,截断小数部分
cout << "\n整数除法: 7 / 2 = " << x / y << endl; // 3
// 浮点除法:至少有一个操作数是浮点数
cout << "浮点除法: 7.0 / 2 = " << 7.0 / y << endl; // 3.5
cout << "浮点除法: 7 / 2.0 = " << x / 2.0 << endl; // 3.5
// ============ 自增自减运算符 ============
int num = 5;
// 前置自增:先加1,再使用
int prefix = ++num; // num变为6,prefix为6
cout << "\n前置自增: num = " << num << ", prefix = " << prefix << endl;
// 后置自增:先使用,再加1
num = 5; // 重置
int postfix = num++; // num变为6,postfix为5
cout << "后置自增: num = " << num << ", postfix = " << postfix << endl;
// 前置自减
num = 5;
int prefixDec = --num; // num变为4,prefixDec为4
cout << "前置自减: num = " << num << ", prefixDec = " << prefixDec << endl;
// 后置自减
num = 5;
int postfixDec = num--; // num变为4,postfixDec为5
cout << "后置自减: num = " << num << ", postfixDec = " << postfixDec << endl;
// ============ 复合赋值运算符 ============
int n = 10;
n += 5; // 等价于 n = n + 5; n = 15
cout << "\nn += 5: " << n << endl;
n -= 3; // 等价于 n = n - 3; n = 12
cout << "n -= 3: " << n << endl;
n *= 2; // 等价于 n = n * 2; n = 24
cout << "n *= 2: " << n << endl;
n /= 4; // 等价于 n = n / 4; n = 6
cout << "n /= 4: " << n << endl;
n %= 4; // 等价于 n = n % 4; n = 2
cout << "n %= 4: " << n << endl;
return 0;
}关系运算符
cpp
#include <iostream>
using namespace std;
int main() {
// ============ 关系运算符 ============
int a = 10, b = 20;
// 等于 ==
bool isEqual = (a == b);
cout << a << " == " << b << " : " << isEqual << endl; // 0 (false)
// 不等于 !=
bool notEqual = (a != b);
cout << a << " != " << b << " : " << notEqual << endl; // 1 (true)
// 大于 >
bool greater = (a > b);
cout << a << " > " << b << " : " << greater << endl; // 0 (false)
// 小于 <
bool less = (a < b);
cout << a << " < " << b << " : " << less << endl; // 1 (true)
// 大于等于 >=
bool greaterEqual = (a >= b);
cout << a << " >= " << b << " : " << greaterEqual << endl; // 0 (false)
// 小于等于 <=
bool lessEqual = (a <= b);
cout << a << " <= " << b << " : " << lessEqual << endl; // 1 (true)
// ============ 比较浮点数 ============
double x = 0.1 + 0.2;
double y = 0.3;
// 直接比较可能失败(浮点精度问题)
cout << "\n0.1 + 0.2 == 0.3 : " << (x == y) << endl; // 可能是0
// 正确的比较方法:使用epsilon
double epsilon = 1e-9;
bool nearlyEqual = (abs(x - y) < epsilon);
cout << "使用epsilon比较: " << nearlyEqual << endl; // 1 (true)
// ============ 比较字符串 ============
#include <string>
string s1 = "hello";
string s2 = "world";
string s3 = "hello";
cout << "\n字符串比较:" << endl;
cout << s1 << " == " << s3 << " : " << (s1 == s3) << endl; // 1 (true)
cout << s1 << " == " << s2 << " : " << (s1 == s2) << endl; // 0 (false)
cout << s1 << " < " << s2 << " : " << (s1 < s2) << endl; // 1 (true,字典序)
// ============ 在条件中使用 ============
int score = 75;
cout << "\n条件判断:" << endl;
if (score >= 60) {
cout << "分数 " << score << " 及格" << endl;
}
if (score >= 90) {
cout << "优秀" << endl;
} else if (score >= 80) {
cout << "良好" << endl;
} else if (score >= 60) {
cout << "及格" << endl;
} else {
cout << "不及格" << endl;
}
return 0;
}逻辑运算符
cpp
#include <iostream>
using namespace std;
int main() {
// ============ 逻辑运算符 ============
bool a = true, b = false;
// 逻辑与 &&(两边都为true才为true)
cout << "true && false = " << (a && b) << endl; // 0 (false)
cout << "true && true = " << (a && a) << endl; // 1 (true)
// 逻辑或 ||(任一边为true就为true)
cout << "true || false = " << (a || b) << endl; // 1 (true)
cout << "false || false = " << (b || b) << endl; // 0 (false)
// 逻辑非 !(取反)
cout << "!true = " << !a << endl; // 0 (false)
cout << "!false = " << !b << endl; // 1 (true)
// ============ 短路求值 ============
cout << "\n短路求值:" << endl;
// 逻辑与短路:如果左边为false,右边不执行
int x = 0;
bool result1 = (x != 0) && (10 / x > 1); // 右边不执行,避免除零错误
cout << "(x != 0) && (10 / x > 1) = " << result1 << endl;
// 逻辑或短路:如果左边为true,右边不执行
bool result2 = (x == 0) || (10 / x > 1); // 右边不执行
cout << "(x == 0) || (10 / x > 1) = " << result2 << endl;
// ============ 实际应用 ============
int age = 25;
bool hasLicense = true;
// 检查是否可以驾驶
if (age >= 18 && hasLicense) {
cout << "\n可以驾驶" << endl;
}
// 检查是否是周末
int day = 6; // 周六
if (day == 6 || day == 7) {
cout << "今天是周末" << endl;
}
// 检查成绩等级
int score = 85;
if (score >= 80 && score < 90) {
cout << "成绩良好" << endl;
}
// 检查字符类型
char ch = 'A';
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
cout << ch << " 是字母" << endl;
}
// ============ 位运算实现逻辑运算 ============
// & 位与:可以用于逻辑运算,但不短路
// | 位或:可以用于逻辑运算,但不短路
bool p = true, q = false;
cout << "\n位运算实现逻辑运算:" << endl;
cout << "true & false = " << (p & q) << endl; // 0
cout << "true | false = " << (p | q) << endl; // 1
// 注意:位运算会对两边都求值,不会短路
return 0;
}位运算符
cpp
#include <iostream>
#include <bitset>
using namespace std;
int main() {
// ============ 位运算符 ============
unsigned int a = 0b1100; // 12
unsigned int b = 0b1010; // 10
// 按位与 &(两位都为1才为1)
unsigned int andResult = a & b; // 0b1000 = 8
cout << "1100 & 1010 = " << bitset<4>(andResult) << " (" << andResult << ")" << endl;
// 按位或 |(任一位为1就为1)
unsigned int orResult = a | b; // 0b1110 = 14
cout << "1100 | 1010 = " << bitset<4>(orResult) << " (" << orResult << ")" << endl;
// 按位异或 ^(两位不同为1,相同为0)
unsigned int xorResult = a ^ b; // 0b0110 = 6
cout << "1100 ^ 1010 = " << bitset<4>(xorResult) << " (" << xorResult << ")" << endl;
// 按位取反 ~(0变1,1变0)
unsigned int notResult = ~a;
cout << "~1100 = " << bitset<8>(notResult) << endl;
// 左移 <<(向左移动n位,低位补0)
unsigned int leftShift = a << 2; // 0b110000 = 48
cout << "1100 << 2 = " << bitset<8>(leftShift) << " (" << leftShift << ")" << endl;
// 右移 >>(向右移动n位,高位补0)
unsigned int rightShift = a >> 2; // 0b0011 = 3
cout << "1100 >> 2 = " << bitset<4>(rightShift) << " (" << rightShift << ")" << endl;
// ============ 位运算应用 ============
cout << "\n===== 位运算应用 =====" << endl;
// 1. 快速乘除2的幂
int num = 10;
cout << num << " * 2 = " << (num << 1) << endl; // 乘2
cout << num << " * 4 = " << (num << 2) << endl; // 乘4
cout << num << " / 2 = " << (num >> 1) << endl; // 除2
cout << num << " / 4 = " << (num >> 2) << endl; // 除4
// 2. 判断奇偶
cout << "\n判断奇偶:" << endl;
for (int i = 0; i < 5; i++) {
if (i & 1) {
cout << i << " 是奇数" << endl;
} else {
cout << i << " 是偶数" << endl;
}
}
// 3. 交换两个数(不使用临时变量)
int x = 5, y = 10;
cout << "\n交换前: x = " << x << ", y = " << y << endl;
x = x ^ y;
y = x ^ y;
x = x ^ y;
cout << "交换后: x = " << x << ", y = " << y << endl;
// 4. 权限管理
const int READ = 0b001; // 读权限
const int WRITE = 0b010; // 写权限
const int EXECUTE = 0b100; // 执行权限
int permission = READ | WRITE; // 有读和写权限
cout << "\n权限检查:" << endl;
cout << "读权限: " << ((permission & READ) ? "有" : "无") << endl;
cout << "写权限: " << ((permission & WRITE) ? "有" : "无") << endl;
cout << "执行权限: " << ((permission & EXECUTE) ? "有" : "无") << endl;
// 添加执行权限
permission |= EXECUTE;
cout << "添加执行权限后: " << bitset<3>(permission) << endl;
// 移除写权限
permission &= ~WRITE;
cout << "移除写权限后: " << bitset<3>(permission) << endl;
// 5. 获取和设置特定位
int value = 0b10110100;
// 获取第3位(从右往左,从0开始)
int bit3 = (value >> 3) & 1;
cout << "\n第3位: " << bit3 << endl;
// 设置第2位为1
value |= (1 << 2);
cout << "设置第2位后: " << bitset<8>(value) << endl;
// 清除第2位
value &= ~(1 << 2);
cout << "清除第2位后: " << bitset<8>(value) << endl;
return 0;
}赋值运算符
cpp
#include <iostream>
using namespace std;
int main() {
// ============ 基本赋值运算符 ============
int a = 10; // 基本赋值
cout << "a = " << a << endl;
// 连续赋值(从右向左)
int b, c;
b = c = a; // 先c = a,再b = c
cout << "b = " << b << ", c = " << c << endl;
// ============ 复合赋值运算符 ============
int num = 10;
// 加法赋值
num += 5; // num = num + 5 = 15
cout << "\nnum += 5: " << num << endl;
// 减法赋值
num -= 3; // num = num - 3 = 12
cout << "num -= 3: " << num << endl;
// 乘法赋值
num *= 2; // num = num * 2 = 24
cout << "num *= 2: " << num << endl;
// 除法赋值
num /= 4; // num = num / 4 = 6
cout << "num /= 4: " << num << endl;
// 取模赋值
num %= 4; // num = num % 4 = 2
cout << "num %= 4: " << num << endl;
// 位运算赋值
num = 0b1100;
num &= 0b1010; // num = num & 0b1010 = 0b1000
cout << "\nnum &= 0b1010: " << num << endl;
num |= 0b0010; // num = num | 0b0010 = 0b1010
cout << "num |= 0b0010: " << num << endl;
num ^= 0b1111; // num = num ^ 0b1111 = 0b0101
cout << "num ^= 0b1111: " << num << endl;
num <<= 2; // num = num << 2 = 0b10100
cout << "num <<= 2: " << num << endl;
num >>= 1; // num = num >> 1 = 0b1010
cout << "num >>= 1: " << num << endl;
// ============ 赋值表达式 ============
// 赋值是一个表达式,有返回值
int x;
int y = (x = 5); // x被赋值为5,y也被赋值为5
cout << "\nx = " << x << ", y = " << y << endl;
// 在条件中使用赋值表达式
int value;
if ((value = getValue()) > 0) { // 假设getValue返回正数
cout << "value = " << value << endl;
}
return 0;
}
int getValue() {
return 42;
}条件运算符
cpp
#include <iostream>
using namespace std;
int main() {
// ============ 三目运算符 ============
// 语法:条件 ? 表达式1 : 表达式2
// 如果条件为真,返回表达式1的值;否则返回表达式2的值
int a = 10, b = 20;
// 求最大值
int max = (a > b) ? a : b;
cout << "max(" << a << ", " << b << ") = " << max << endl;
// 求最小值
int min = (a < b) ? a : b;
cout << "min(" << a << ", " << b << ") = " << min << endl;
// 求绝对值
int num = -5;
int absValue = (num < 0) ? -num : num;
cout << "|" << num << "| = " << absValue << endl;
// ============ 嵌套三目运算符 ============
int score = 75;
// 根据分数判断等级
string grade = (score >= 90) ? "A" :
(score >= 80) ? "B" :
(score >= 70) ? "C" :
(score >= 60) ? "D" : "F";
cout << "\n分数 " << score << " 的等级是 " << grade << endl;
// ============ 三目运算符与if-else对比 ============
// 使用三目运算符
int x = 5;
int result1 = (x > 0) ? x * 2 : x * -1;
// 等价的if-else
int result2;
if (x > 0) {
result2 = x * 2;
} else {
result2 = x * -1;
}
cout << "\n三目运算符结果: " << result1 << endl;
cout << "if-else结果: " << result2 << endl;
// ============ 在输出中使用 ============
int count = 1;
cout << "\n你有 " << count << " 条" << (count > 1 ? "消息" : "消息") << endl;
count = 5;
cout << "你有 " << count << " 条" << (count > 1 ? "消息" : "消息") << endl;
// ============ 注意事项 ============
// 三目运算符的两个表达式类型应该兼容
int val = 10;
// auto r = (val > 0) ? val : "negative"; // 错误:类型不匹配
// 正确做法
string result = (val > 0) ? to_string(val) : "negative";
cout << "\n结果: " << result << endl;
return 0;
}逗号运算符
cpp
#include <iostream>
using namespace std;
int main() {
// ============ 逗号运算符 ============
// 逗号运算符用于连接两个表达式
// 从左到右依次执行,返回最后一个表达式的值
int a = 5;
int b = 10;
// 逗号表达式
int result = (a++, b++, a + b);
// 执行过程:
// 1. a++ -> a变为6
// 2. b++ -> b变为11
// 3. a + b -> 6 + 11 = 17
// result = 17
cout << "a = " << a << ", b = " << b << endl; // a=6, b=11
cout << "result = " << result << endl; // result=17
// ============ 在for循环中使用 ============
cout << "\nfor循环中使用逗号运算符:" << endl;
// 同时初始化和更新多个变量
for (int i = 0, j = 10; i < j; i++, j--) {
cout << "i = " << i << ", j = " << j << endl;
}
// ============ 在赋值中使用 ============
int x, y, z;
// 连续赋值(注意:这不是逗号运算符)
x = y = z = 0;
// 使用逗号运算符
int sum = (x = 1, y = 2, z = 3, x + y + z);
cout << "\nsum = " << sum << endl; // sum = 6
// ============ 注意事项 ============
// 逗号运算符的优先级最低
int num = 5;
int result2 = num++, num * 2; // 注意:这不是逗号运算符!
// 等价于:(int result2 = num++), (num * 2);
// result2 = 5,然后num变为6
cout << "\nnum = " << num << ", result2 = " << result2 << endl;
// 正确使用括号
num = 5;
int result3 = (num++, num * 2); // result3 = 12
cout << "num = " << num << ", result3 = " << result3 << endl;
return 0;
}sizeof运算符
cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
// ============ sizeof基本用法 ============
// sizeof用于获取类型或变量的大小(字节数)
// 获取基本类型大小
cout << "===== 基本类型大小 =====" << endl;
cout << "sizeof(char): " << sizeof(char) << " 字节" << endl;
cout << "sizeof(short): " << sizeof(short) << " 字节" << endl;
cout << "sizeof(int): " << sizeof(int) << " 字节" << endl;
cout << "sizeof(long): " << sizeof(long) << " 字节" << endl;
cout << "sizeof(long long): " << sizeof(long long) << " 字节" << endl;
cout << "sizeof(float): " << sizeof(float) << " 字节" << endl;
cout << "sizeof(double): " << sizeof(double) << " 字节" << endl;
cout << "sizeof(bool): " << sizeof(bool) << " 字节" << endl;
// ============ sizeof变量 ============
int num = 10;
double pi = 3.14;
char ch = 'A';
cout << "\n===== 变量大小 =====" << endl;
cout << "sizeof(num): " << sizeof(num) << " 字节" << endl;
cout << "sizeof(pi): " << sizeof(pi) << " 字节" << endl;
cout << "sizeof(ch): " << sizeof(ch) << " 字节" << endl;
// sizeof可以省略括号(用于变量时)
cout << "sizeof num: " << sizeof num << " 字节" << endl; // 等价于sizeof(num)
// ============ sizeof数组 ============
int arr[] = {1, 2, 3, 4, 5};
// 数组大小 = 总字节数
cout << "\n===== 数组大小 =====" << endl;
cout << "sizeof(arr): " << sizeof(arr) << " 字节" << endl; // 20字节(5个int)
// 计算数组元素个数
int length = sizeof(arr) / sizeof(arr[0]);
cout << "数组元素个数: " << length << endl;
// ============ sizeof指针 ============
int* ptr = arr;
cout << "\n===== 指针大小 =====" << endl;
cout << "sizeof(ptr): " << sizeof(ptr) << " 字节" << endl; // 指针大小(32位系统4字节,64位系统8字节)
cout << "sizeof(*ptr): " << sizeof(*ptr) << " 字节" << endl; // int的大小(4字节)
// ============ sizeof字符串 ============
const char* cstr = "hello";
string cppstr = "hello";
cout << "\n===== 字符串大小 =====" << endl;
cout << "sizeof(cstr): " << sizeof(cstr) << " 字节" << endl; // 指针大小
cout << "sizeof(cppstr): " << sizeof(cppstr) << " 字节" << endl; // string对象大小
cout << "cppstr.length(): " << cppstr.length() << endl; // 字符串长度
// ============ sizeof结构体 ============
struct Student {
char name[20]; // 20字节
int age; // 4字节
double score; // 8字节
};
Student stu;
cout << "\n===== 结构体大小 =====" << endl;
cout << "sizeof(Student): " << sizeof(Student) << " 字节" << endl;
cout << "sizeof(stu): " << sizeof(stu) << " 字节" << endl;
// 注意:结构体大小可能因为内存对齐而大于成员大小之和
cout << "成员大小之和: " << sizeof(stu.name) + sizeof(stu.age) + sizeof(stu.score) << " 字节" << endl;
// ============ sizeof与容器 ============
vector<int> vec = {1, 2, 3, 4, 5};
cout << "\n===== 容器大小 =====" << endl;
cout << "sizeof(vec): " << sizeof(vec) << " 字节" << endl; // vector对象大小
cout << "vec.size(): " << vec.size() << endl; // 元素个数
return 0;
}运算符优先级
cpp
#include <iostream>
using namespace std;
int main() {
// ============ 运算符优先级 ============
/*
* 运算符优先级(从高到低):
*
* 1. :: 作用域解析
* 2. () [] -> . ++ -- 后缀运算符
* 3. ++ -- + - ! ~ * & sizeof 前缀运算符
* 4. new delete 内存管理
* 5. .* ->* 成员指针
* 6. * / % 乘除模
* 7. + - 加减
* 8. << >> 移位
* 9. < <= > >= 关系运算符
* 10. == != 相等运算符
* 11. & 位与
* 12. ^ 位异或
* 13. | 位或
* 14. && 逻辑与
* 15. || 逻辑或
* 16. ?: 条件运算符
* 17. = += -= *= /= %= &= ^= |= <<= >>= 赋值运算符
* 18. , 逗号运算符
*/
// 示例:优先级影响结果
int a = 5, b = 3, c = 2;
// 算术运算优先级
int result1 = a + b * c; // 先乘后加:5 + 6 = 11
int result2 = (a + b) * c; // 先加后乘:8 * 2 = 16
cout << "a + b * c = " << result1 << endl;
cout << "(a + b) * c = " << result2 << endl;
// 关系运算与逻辑运算
bool result3 = a > b && b > c; // 先比较后逻辑与
bool result4 = a > b || b > c; // 先比较后逻辑或
cout << "\na > b && b > c = " << result3 << endl;
cout << "a > b || b > c = " << result4 << endl;
// 位运算与比较
int x = 6; // 0b110
int y = 3; // 0b011
// 注意:比较运算符优先级高于位运算符
// int wrong = x & y > 0; // 等价于 x & (y > 0),可能不是预期结果
int correct = (x & y) > 0; // 正确写法
cout << "\n(x & y) > 0 = " << correct << endl;
// 赋值与比较
int val;
// if (val = getValue() > 0) // 错误:先比较后赋值
if ((val = getValue()) > 0) { // 正确:先赋值后比较
cout << "val = " << val << endl;
}
// ============ 使用括号明确优先级 ============
// 建议:使用括号明确优先级,提高可读性
int complex = ((a + b) * c - 10) / 2;
cout << "\n((a + b) * c - 10) / 2 = " << complex << endl;
return 0;
}
int getValue() {
return 42;
}本章小结
本章学习了:
- 算术运算符:+、-、*、/、%、++、--
- 关系运算符:==、!=、>、<、>=、<=
- 逻辑运算符:&&、||、!
- 位运算符:&、|、^、~、<<、>>
- 赋值运算符:=、+=、-=、*=、/=、%=等
- 条件运算符:?:
- 逗号运算符:,
- sizeof运算符:获取类型或变量大小
- 运算符优先级:使用括号明确优先级
下一章,我们将学习流程控制,了解C语言的条件语句和循环语句。
