目录
62. 按位取反
按位取反(~)是对二进制数中每一位进行反转的操作。对于每个 1 转换为 0,每个 0 转换为 1。
示例代码:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void print_binary(uint8_t num);
int main() {
uint8_t status = 0b00001100; // 初始状态
printf("Initial status: 0b");
print_binary(status);
printf("\t(Binary)\n");
// 按位取反 ~
status = ~status;
printf("FINAL: 0b");
print_binary(status);
printf("\t(Binary)\n");
return 0;
}
void print_binary(uint8_t num) {
for (int index = 7; index >= 0; index--) {
printf("%d", (num >> index) & 1);
}
}
输出结果:
Initial status: 0b00001100 (Binary)
FINAL: 0b11110011 (Binary)
- 解释:
~status对status进行按位取反,将每个0变为1,每个1变为0。
63. 掩码与电路遥控LED灯练习
掩码是通过按位与运算来隐藏某些特定的位。掩码操作在电路控制和设备管理中非常常见。
示例代码:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void print_binary(uint8_t num);
int main() {
uint8_t status = 0b00001100; // 初始状态12
printf("Initial status: 0b");
print_binary(status);
printf("\t(Binary)\n");
status = status & 0b11111011; // 关闭低电量灯
printf("关闭低电量灯: 0b");
print_binary(status);
printf("\t(Binary)\n");
status = status ^ 0b00001011; // 一切正常
printf("一切正常: 0b");
print_binary(status);
printf("\t(Binary)\n");
return 0;
}
void print_binary(uint8_t num) {
for (int index = 7; index >= 0; index--) {
printf("%d", (num >> index) & 1);
}
}
输出结果:
Initial status: 0b00001100 (Binary)
关闭低电量灯: 0b00001000 (Binary)
一切正常: 0b00000011 (Binary)
- 解释:掩码
0b11111011用来关闭低电量灯(按位与),而0b00001011用于恢复正常状态(按位异或)。
64. C语言逻辑运算符
在 C 语言中,逻辑运算符用于表达条件判断。常见的逻辑运算符有:&&(与)、||(或)。
示例代码:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>
int main() {
int condition_a = 1;
int condition_b = 0;
// 逻辑与 &&
int result = condition_a && condition_b;
printf("result = %d\n", result); // 0
// 逻辑或 ||
result = condition_a || condition_b;
printf("result = %d\n", result); // 1
return 0;
}
输出结果:
result = 0
result = 1
-
解释
:
&&逻辑与:只有两个条件都为真时,结果才为真。||逻辑或:只要有一个条件为真,结果即为真。
65. 复合赋值
复合赋值运算符(如 +=、-=、*= 等)可以使得运算过程更简洁。
示例代码:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main() {
int base_number = 8;
int add_number = 2;
int sub_number = 3;
int mul_number = 4;
int div_number = 2;
int mod_number = 5;
int left_shift_number = 1;
int right_shift_number = 2;
int and_number = 0b1010;
int or_number = 0b0101;
int xor_number = 0b1111;
base_number += add_number;
printf("%d\n", base_number);
base_number -= sub_number;
printf("%d\n", base_number);
base_number *= mul_number;
printf("%d\n", base_number);
base_number /= div_number;
printf("%d\n", base_number);
base_number %= mod_number;
printf("%d\n", base_number);
base_number <<= left_shift_number;
printf("%d\n", base_number);
base_number >>= right_shift_number;
printf("%d\n", base_number);
base_number &= and_number;
printf("%d\n", base_number);
base_number |= or_number;
printf("%d\n", base_number);
base_number ^= xor_number;
printf("%d\n", base_number);
return 0;
}
输出结果:
10
7
28
14
4
8
2
2
7
3
- 解释:每个复合赋值符号都表示对原变量的原地操作。例如
+=会把右侧值加到左侧变量,直接修改左侧变量的值。
66. 逗号运算符
逗号运算符可以在同一个语句中执行多个操作,并返回最后一个操作的结果。
示例代码:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main() {
uint32_t a = 1, b = 1, c = 1;
uint32_t result = (a += 1, b += 2, c += 3); // 逗号运算符,最终结果是最后一次操作的结果
printf("a = %d, b = %d, c = %d, result = %d\n", a, b, c, result);
return 0;
}
输出结果:
a = 2, b = 3, c = 4, result = 4
- 解释:逗号运算符从左至右依次执行每个表达式,但只返回最后一个表达式的值。
67. 计算的优先级和顺序
C语言中的运算符有明确的优先级,影响着表达式的计算顺序。
示例代码:
#include <stdio.h>
#include <stdint.h>
int main() {
int32_t result;
int32_t a = 5, b = 3, c = 2;
result = a + b * c;
printf("%d\n", result); // 11
result = (a + b) * c;
printf("%d\n", result); // 16
return 0;
}
输出结果:
11
16
- 解释:在第一个表达式中,乘法
*的优先级高于加法+,所以先执行b * c。而在第二个表达式中,由于括号的存在,先执行加法。
68. 计算优先级和顺序练习第一讲
计算优先级和顺序决定了复杂表达式的计算顺序。
示例代码:
#include <stdio.h>
#include <stdint.h>
int main() {
int32_t a = 5, b = 3, c = 2, d = 4, e = 1;
int32_t result;
result = a * b + c << d > e ? b : c * sizeof(++e) / sizeof(int32_t);
printf("Result: %" PRId32 "\n", result);
return 0;
}
- 解释:根据优先级,首先计算
a * b + c,然后执行左移和比较,最后通过条件运算符决定结果。
72. if 与 if else
if 和 else 用于根据条件控制程序的执行路径。
示例代码:
#include <stdio.h>
#include <stdint.h>
int main() {
uint32_t number = 9;
if (number > 10) {
printf("这个数大于10!\n");
}
else {
printf("这个
值小于等于10!\n"); }
return 0;
}
#### 输出结果:
这个值小于等于10!
- **解释**:`if` 用于判断条件,如果条件成立,执行 `if` 块的内容;否则,执行 `else` 块的内容。
---
### 73. `else if`
`else if` 允许多个条件判断,可以实现多个分支选择。
#### 示例代码:
```c
#include <stdio.h>
int main() {
float current_temperature = 35.0f;
if (current_temperature > 30.0) {
printf("天气热了,需要开空调冷气\n");
}
else if (current_temperature < -1.0) {
printf("天气冷了,需要开空调制暖\n");
}
else {
printf("不需要开空调\n");
}
return 0;
}
输出结果:
天气热了,需要开空调冷气
- 解释:通过
else if判断多个条件,可以实现不同情况的处理。
74. if 嵌套
通过嵌套 if 语句,可以处理更加复杂的逻辑判断。
示例代码:
#include <stdio.h>
int main() {
double cart_total = 120;
bool is_vip = true;
double discount_rate = 0.0;
if (is_vip) {
if (cart_total > 100) {
discount_rate = 0.20;
}
else {
discount_rate = 0.05;
}
}
else {
if (cart_total > 50) {
discount_rate = 0.10;
}
else {
discount_rate = 0.0;
}
}
printf("你的折扣为:%.2f%%\n", discount_rate * 100);
return 0;
}
输出结果:
你的折扣为:20.00%
- 解释:根据是否为 VIP 和购物车总额,提供不同的折扣。
75. 为什么要避免嵌套
过多的嵌套层次会使代码复杂且难以理解。建议尽量将条件判断扁平化,避免深层嵌套。
76. 策略模式
策略模式是设计模式中的一种,它通过封装不同的行为来使得程序具有更高的灵活性。
78. if...else 与其他逻辑符的练习
通过结合 if...else 和逻辑运算符,可以实现多重复杂条件判断。
示例代码:
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
int main(void) {
bool is_vip = true;
uint32_t coins = 4;
bool has_special_item = false;
if (is_vip) {
printf("玩家可以进入房间A。\n");
} else {
printf("没有VIP身份,不能进入房间A。\n");
}
if (coins >= 10 || has_special_item) {
printf("玩家可以进入房间B。\n");
} else {
printf("玩家不能进入房间B,因为至少需要特殊道具或者至少有10个金币。\n");
}
if (is_vip && coins >= 20) {
printf("玩家可以进入房间C\n");
} else {
printf("玩家不能进入房间C,因为玩家需要有VIP身份,并且金币数量不得少于20\n");
}
if ((is_vip || has_special_item) && coins >= 5) {
printf("玩家可以进入房间D。\n");
} else {
printf("玩家不能进入房间D,因为玩家需要有VIP 或者 特殊道具,并且金币数量不少于5\n");
}
return 0;
}
输出结果:
玩家可以进入房间A。
玩家不能进入房间B,因为至少需要特殊道具或者至少有10个金币。
玩家不能进入房间C,因为玩家需要有VIP身份,并且金币数量不得少于20
玩家不能进入房间D,因为玩家需要有VIP 或者 特殊道具,并且金币数量不少于5
80. switch...case 的用途
switch...case 提供了一种简洁的多条件判断方法,适用于多个分支的判断。
示例代码:
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint8_t role = 2; // 1=Manager; 2=Employee; 3=Intern
uint8_t completed_tasks = 6;
bool is_manager_approved = false; // 经理批准
bool access_allowed = false;
switch (role) {
case 1: // role == 1, manager
access_allowed = true;
break; // 跳出
case 2:
if (completed_tasks > 5) {
access_allowed = true;
}
break;
case 3 :
if (completed_tasks > 10 && is_manager_approved) {
access_allowed = true;
}
break;
default: //默认情况下
access_allowed = false;
break;
}
if (access_allowed) {
puts("允许访问");
} else {
puts("拒绝访问");
}
return 0;
}
输出结果:
允许访问
- 解释:
switch...case通过判断角色 (role) 来确定是否允许访问。
81. 再探条件运算符
条件运算符 ? : 提供了一种简洁的方式来实现简单的条件判断。
示例代码:
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t score = 60;
char grade;
grade = (score >= 90) ? 'A' :
(score >= 80) ? 'B' :
(score >= 70) ? 'C' : 'D';
printf("得分:%u, 等级:%c\n", score, grade);
return 0;
}
输出结果:
得分:60, 等级:D
- 解释:使用条件运算符来快速判断学生的等级。

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



