KyrieChao

开始学习

2026-08-03

技术

C 语言

学习内容:C 语言 Day7 笔记——流程控制结构

选择结构

结构 语法 适用场景
if 单分支 if (表达式) { ... } 条件满足时执行
if-else 双分支 if (表达式) { ... } else { ... } 二选一
if-else if-else 多分支 多个 else if 级联 多选一
switch switch (整数) { case 值: ... break; } 整数的等值比较
  • C 语言中非零即为真,零为假
  • switch 有**穿透(Fall-through)**特性,漏写 break 会继续执行后续 case
  • 空语句 ; 也是合法语句,编译后对应 NOP 指令

循环结构

循环 最少执行次数 适用场景
while (条件) { ... } 0 次 循环次数未知
do { ... } while (条件); 1 次 至少执行一次
for (初始化; 条件; 迭代) { ... } 0 次 循环次数已知(最常用)
  • for 的三个表达式都可留空,但两个分号必须写
  • 精确控制 n 次循环:for (int i = 0; i < n; i++)
  • 嵌套不建议超过 3 层

跳转语句

语句 作用
break 结束 switch 或跳出当前层循环
continue 跳过本次循环剩余部分,进入下一次迭代
goto 无条件跳转到标签处(不推荐使用)

输入输出

  • printf("格式串", 变量...) — 格式化输出
  • scanf("格式串", &变量...) — 格式化输入,必须传地址 &

小工具

今天写了个小脚本 run.html,用于简化单个 C 文件的编译运行流程。

Rust

今天学的内容不多,主要是线程部分的巩固复习

之前 Rustlings threads 章节已经做完了,但感觉自己还是不太熟,今天重新手写了一遍基础用法:

use std::thread;
use std::time::Duration;

fn main() {
    // join 等待子线程完成
    let handle = thread::spawn(|| {
        thread::sleep(Duration::from_secs(3));
        println!("子线程:下载完成!");
    });
    println!("主线程:做别的事");
    handle.join().unwrap();
    println!("主线程:子线程结束了,我也结束了");

    // 不 join 的情况:主线程结束时子线程可能还没跑完
    thread::spawn(|| {
        thread::sleep(Duration::from_millis(100));
        println!("子线程:完成了!");
    });
    println!("主线程:结束了");
    // 这里主线程结束,子线程可能来不及执行
}

复习要点:

  • thread::spawn 创建新线程,返回 JoinHandle
  • handle.join() 阻塞主线程,等待子线程完成
  • join 的话,主线程结束程序就结束了,子线程可能来不及执行
  • move 闭包用于把外部变量所有权移入线程

思考

价值是通过他人评判出来的吗?人的价值只能通过外部评判出来吗?

我觉得是的。

拿梵高的画来说——他死前根本没人看得上。如果说梵高的画"本来就有价值",那该怪谁?怪世道吗?

他死后才被人看到。人们常说他的价值被"发现"了,但"发现"这个词不准——因为他死前根本没人看出来,何来发现一说?

换个角度想:假如那时候有人出钱给他办个展,大力宣传一番,有权有势的人来了、捧了,人们自然就觉得他的画有价值了。

所以归根结底,价值是人自己赋予的

如果有人说"价值本身就在那里,不需要谁来承认"——这不过是人试图用自己定义的框架,去框住一个本不属于它的名字罢了。

明日计划

  1. Rust:继续线程部分深入学习——mpsc::channel 消息传递、Arc<Mutex<T>> 共享内存模式