V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zhengqiaoyin
V2EX  ›  程序员

怎么看这两个代码?

  •  
  •   zhengqiaoyin · 2023-08-11 10:50:12 +08:00 · 4050 次点击
    这是一个创建于 500 天前的主题,其中的信息可能已经有所发展或是发生改变。

    图片 1

    图片 2

    看了一篇关于 linus 的内容,不知该如何评价这两张图


    补一个来源吧:一个 Liuns 的故事

    24 条回复    2023-08-13 09:58:08 +08:00
    liuyunlong
        1
    liuyunlong  
       2023-08-11 11:02:35 +08:00
    地址
    NessajCN
        2
    NessajCN  
       2023-08-11 11:31:19 +08:00
    变量定义得越少,if 用得越少,代码越优雅呗
    cuihua
        3
    cuihua  
       2023-08-11 11:36:08 +08:00   ❤️ 6
    具体情况具体分析:
    1. 内核中使用第二种,因为都是大佬看,而且内核用的多,千锤百炼不会有问题。
    2. 工程中我选择前者,kiss 原则,性能相同,代码蠢一点更好
    misdake
        4
    misdake  
       2023-08-11 11:39:40 +08:00 via Android
    indirect 很好地覆盖了 head 的特殊性,后续代码不再需要关心这个问题,节约了注意力,不容易出 bug ,后续维护也不容易出错
    weeei
        5
    weeei  
       2023-08-11 14:41:15 +08:00
    初学肯定是从第一种写起。
    第二种是高级写法,就是把第一种的思考逻辑做了合并,两个逻辑是等价的。
    我这种菜鸟是打死都想不到第二种的,没办法没有天赋。
    weeei
        6
    weeei  
       2023-08-11 14:45:03 +08:00
    这里是内核代码,最求的节省 CPU 时钟,第二种对大牛来说才是正常代码。
    Ianchen
        7
    Ianchen  
       2023-08-11 14:47:22 +08:00   ❤️ 2
    优雅永不过时,喜欢并且认同第二种写法
    janus77
        8
    janus77  
       2023-08-11 14:50:30 +08:00
    第二种好是好,不适合我这种菜鸟
    Shatyuka
        9
    Shatyuka  
       2023-08-11 14:58:14 +08:00
    HaroldFinchNYC
        10
    HaroldFinchNYC  
       2023-08-11 15:04:51 +08:00
    这是一次 TED 采访里的代码片段

    你要是能看懂第二种,自然就用第二种
    x77
        11
    x77  
       2023-08-11 15:17:11 +08:00 via Android
    我的视角看第二种比第一种更热爱技术,觉得到了一个阶段自然而然的就会慢慢转向第二种写法,也更喜欢看到第二种的写法
    bojackhorseman
        12
    bojackhorseman  
       2023-08-11 15:21:30 +08:00
    虽然我看不懂,但我知道这是 Linus 在一次 Ted 上举出的好坏对比示例代码
    lixile
        13
    lixile  
       2023-08-11 15:31:03 +08:00
    @Shatyuka emmmmmm 我说个奇怪的地方 因为我常用版本是 gcc 9.3.0 我就把上面代码切换到 gcc 9.3.0 发现 居然是前面一种指令集更少 是 16 行 第二种 18 行
    zagfai
        14
    zagfai  
       2023-08-11 15:41:02 +08:00
    15 年前我写 c 就用第二种了,明显是水平差距
    lsk569937453
        15
    lsk569937453  
       2023-08-11 15:43:33 +08:00
    我看不懂 c++。还好有 python,js,java 这些语言,让编程的门槛减低了很多。
    Shatyuka
        16
    Shatyuka  
       2023-08-11 16:03:02 +08:00
    @lixile 所以我更喜欢 clang 一点
    gcc 两个汇编差不多,一个
    ```
    mov QWORD PTR [rdx+8], rax
    ```
    一个
    ```
    add rdx, 8
    mov QWORD PTR [rdx], rax
    ```
    Projection
        17
    Projection  
       2023-08-11 16:57:16 +08:00
    像 Java 、JavaScript 这类没有指针的语言,想要修改一个对象的 next 字段必须先获取到这个对象才能修改,所以必须用变量存储这个对象本身;而不能像 C/C++ 那样可以拿到 next 字段的指针来修改。第一种方法基本所有语言都可以用,第二种必须要语言支持指针,这更多是语言差异。

    对于链表操作来说,用第一种方法时,有头结点和没有头结点操作链表的方式有差异,所以有时出于方便会选择使用头结点。但如果像第二种写法一样使用指向 next 字段的指针或引用,有没有头结点操作都很方便。
    yolee599
        18
    yolee599  
       2023-08-11 17:16:38 +08:00
    if-else 里面只有一条语句,我看着也不舒服,特别是 C style 的代码
    lcingOnTheCake
        19
    lcingOnTheCake  
       2023-08-11 17:22:16 +08:00
    这是伪代码吧
    cnbatch
        20
    cnbatch  
       2023-08-11 17:23:31 +08:00
    @lsk569937453 准确来说,这两段代码是纯 C 的
    Peek
        21
    Peek  
       2023-08-11 17:52:02 +08:00   ❤️ 1
    写程序不是文学,没有啥优雅不优雅的,先让代码跑起来,后面再考虑要不要优化,直接用第二种思维写容易出问题,除非你已经相当的熟悉,建议用第一种写,有时间可以优化成第二种
    ClarkAbe
        22
    ClarkAbe  
       2023-08-11 21:00:19 +08:00 via Android
    @Peek #21 我个人不敢苟同...写代码在应保证程序正常完成任务的前提下应该尽量考虑最少 alloc 以及 逻辑简化, 不然只会无休止的重构...但是这并不能完全解决问题甚至无脑重构/重写是完全不负责任的一种行为
    netabare
        23
    netabare  
       2023-08-12 20:23:57 +08:00 via Android   ❤️ 1
    第二种肯定更好维护,性能也更高,但不一定总是写得出来。一般情况下两种其实都可以。
    lanlanye
        24
    lanlanye  
       2023-08-13 09:58:08 +08:00 via iPhone
    应该是 TED 那期的例子吧?这两个不是可读性的问题,是第二个就是更好。但除非你写的是 C/C++,否则恐怕没法写出这样的代码…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:57 · PVG 03:57 · LAX 11:57 · JFK 14:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.