一、赋值运算符、
1.1 基本赋值运算符(=)
=是最基础的赋值运算符,用于将右侧表达式的值赋给左侧变量,支持连续赋值。
#include <stdio.h>
int main() {
int a, b, c;
// 简单赋值
a = 10;
printf("a = 10 → a = %d\n", a); // 输出:a = 10
// 连续赋值(从右向左执行)
a = b = c = 100;
printf("a = b = c = 100 → a=%d, b=%d, c=%d\n", a, b, c); // 输出:a=100, b=100, c=100
return 0;
}
1.2 复合赋值运算符
复合赋值运算符将算术 / 位运算与赋值结合,简化代码书写,常见包括+=、-=、*=、/=、%=、&=、|=等。
#include <stdio.h>
int main() {
int a = 10;
printf("初始值: a = %d\n", a); // 输出:10
a += 5; // 等价于 a = a + 5 → 15
printf("a += 5 → a = %d\n", a);
a -= 3; // 等价于 a = a - 3 → 12
printf("a -= 3 → a = %d\n", a);
a *= 2; // 等价于 a = a * 2 → 24
printf("a *= 2 → a = %d\n", a);
a /= 4; // 等价于 a = a / 4 → 6
printf("a /= 4 → a = %d\n", a);
a %= 3; // 等价于 a = a % 3 → 0
printf("a %%= 3 → a = %d\n", a); // 注:%需用%%转义
return 0;
}
1.3 赋值表达式的返回值
赋值表达式本身会返回被赋的值,因此可用于条件判断或表达式嵌套。
#include <stdio.h>
int main() {
int a, b, c;
// 赋值表达式参与计算
a = (b = 10) + 5;
printf("a = (b = 10) + 5 → a=%d, b=%d\n", a, b); // 输出:a=15, b=10
// 条件判断中使用赋值
if ((c = 20) > 15) {
printf("赋值表达式在条件中: c=%d\n", c); // 输出:c=20
}
return 0;
}
二、条件运算符
条件运算符(expr ? expr1 : expr2)是 C 语言中唯一的三目运算符,用于简化if-else逻辑,实现 “条件判断 - 结果选择” 的快速映射。
2.1 基本用法
语法规则:若expr为真,执行expr1;否则执行expr2。
#include <stdio.h>
int main() {
int a = 10, b = 20;
int max;
// 求两数最大值
max = (a > b) ? a : b;
printf("a=%d, b=%d, 较大值是: %d\n", a, b, max); // 输出:20
// 直接嵌入表达式输出
printf("a和b中较小的数是: %d\n", (a < b) ? a : b); // 输出:10
return 0;
}
2.2 嵌套使用
条件运算符支持嵌套,适用于多分支简单判断(如成绩等级划分)。
#include <stdio.h>
int main() {
int score;
printf("请输入成绩: ");
scanf("%d", &score);
// 嵌套判断成绩等级
char grade = (score >= 90) ? 'A' :
(score >= 80) ? 'B' :
(score >= 70) ? 'C' :
(score >= 60) ? 'D' : 'E';
printf("成绩等级: %c\n", grade);
// 判断奇偶性
int num = 15;
printf("%d是%s数\n", num, (num % 2 == 0) ? "偶" : "奇"); // 输出:奇数
return 0;
}
2.3 条件运算符 与 if-else对比
- 等效性:条件运算符可实现简单
if-else的功能,但嵌套过深会降低可读性。 - 适用场景:
- 简单赋值:
int min = (a < b) ? a : b; - 函数参数 / 返回值:
return (age >= 18) ? "成年" : "未成年"; - 常量初始化:
const char* mode = (write_flag) ? "w" : "r";
- 简单赋值:
三、位运算符:二进制位的直接操作
位运算符直接对整数的二进制位进行操作,适用于底层硬件控制、性能优化等场景,常见包括按位与、或、异或、取反、移位等。
3.1 基础位运算规则
| 运算符 | 名称 | 规则 | |
|---|---|---|---|
& | 按位与 | 对应位均为 1 时结果为 1,否则为 0 | |
| ` | ` | 按位或 | 对应位有一个为 1 时结果为 1,否则为 0 |
^ | 按位异或 | 对应位不同时结果为 1,否则为 0 | |
~ | 按位取反 | 每一位取反(1 变 0,0 变 1) | |
<< | 左移 | 二进制位左移,右侧补 0 | |
>> | 右移 | 无符号数左补 0;有符号数左补符号位(算术右移) |
3.2 移位运算的注意事项
(1)左移溢出问题
左移可能导致数值超出类型范围(溢出),且char/short类型会先提升为int再运算。
#include <stdio.h>
int main() {
unsigned char num = 1; // 二进制:00000001
printf("1 << 7 = %d\n", num << 7); // 输出:128(01000000)
printf("1 << 8 = %d\n", (unsigned char)(num << 8)); // 溢出后截断为0
char signed_num = 64; // 01000000
printf("64 << 1 = %d\n", (char)(signed_num << 1)); // 溢出为-128
return 0;
}
(2)右移数据丢失
右移会丢弃右侧低位,有符号负数右移时左侧补 1(最终变为 - 1)。
#include <stdio.h>
int main() {
unsigned char num = 7; // 00000111
printf("7 >> 1 = %d\n", num >> 1); // 输出:3(丢失最低位1)
printf("7 >> 3 = %d\n", num >> 3); // 输出:0(所有有效位丢失)
char negative = -8; // 补码:11111000
printf("-8 >> 2 = %d\n", negative >> 2); // 输出:-2(算术右移补1)
printf("-1 >> 3 = %d\n", (char)-1 >> 3); // 输出:-1(始终补1)
return 0;
}
3.3 位运算的实用技巧
(1)复合位赋值运算
结合赋值的位运算,简化代码:
#include <stdio.h>
int main() {
unsigned char a = 0b01010101; // 85
a &= 0b00001111; // 清零高4位 → 00000101(5)
printf("a &= 0x0F → %d\n", a);
a |= 0b11110000; // 设置高4位 → 11110101(245)
printf("a |= 0xF0 → %d\n", a);
return 0;
}
(2)无临时变量交换值
利用异或运算特性交换两个整数:
#include <stdio.h>
int main() {
int x = 10, y = 20;
printf("交换前: x=%d, y=%d\n", x, y);
x = x ^ y;
y = x ^ y; // 等价于 y = 原x
x = x ^ y; // 等价于 x = 原y
printf("交换后: x=%d, y=%d\n", x, y); // 输出:x=20, y=10
return 0;
}
(3)2 的幂取模优化
用按位与替代取模(仅适用于 2 的幂):
#include <stdio.h>
int main() {
int num = 23;
int mod = num & 15; // 等价于 num % 16(16=2^4)
printf("%d %% 16 = %d\n", num, mod); // 输出:23 % 16 = 7
return 0;
}

被折叠的 条评论
为什么被折叠?



