C语言零基础入门教程:62-81节

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)
  • 解释~statusstatus 进行按位取反,将每个 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. ifif else

ifelse 用于根据条件控制程序的执行路径。

示例代码:
#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
  • 解释:使用条件运算符来快速判断学生的等级。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值