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

噗!“类型弱置”

  •  
  •   cnbatch · 8 天前 · 1741 次点击

    刷知乎时给我推送了一条回答(为什么新兴语言普遍都是类型后置的?
    回答里面有个高赞评论

    完整复制粘贴:

    前置后置都没问题,只要别搞 C 那一坨狗屎。

    前置: int[42] x (或 [42]int x

    后置: var x: int[42] (或 var x: [42]int

    狗屎: int x[42];

    肯定有人问,C 这写法不是很清晰么,为什么说它是狗屎。因为只有它会搞出 int (*[42])(int) 这种晦涩的东西,处理这种东西对做编译器的人、对写程序的人都是灾难。

    评论区的高赞( 2025 年 2 月 3 日):

    这叫类型弱置(狗头)


    其实再早几个月已经有人在另一个条回答的评论区表达过“弱置”,然后有人造词“类型弱置”
    https://www.zhihu.com/question/667841945/answer/3632646566

    继续复制粘贴:

    你跟我说,这种写法

    void ( *signal(int signum, void (*handler)(int)) ) (int);
    

    前置?

    评论区( 2024 年 9 月 30 日):

    a: fn() 后置

    fn() a 前置

    fn (*a)() 弱置

    评论区( 2024 年 10 月 1 日):

    类型弱置

    以及充满了讽刺语气的( 2025 年 3 月 31 日):

    fn (*a)() 外置

    void ( *signal(int signum, void (*handler)(int)) ) (int); 是混合痔


    这些谐音梗真是讽刺度溢出屏幕

    读音“类型弱智”,4 个字表达“类型置位的方式是弱智”

    同样的还有:外置(外痔)、混合痔(混合置)


    正经来讲,其实这是类型中置,但看得出许多人觉得不爽

    目前各个搜索引擎查找“类型弱置”都搜不出实际内容,看来知乎的这条提问,里面的各个留言首创了“类型弱置”这个词

    8 条回复    2025-06-30 14:52:38 +08:00
    Mithril
        1
    Mithril  
       8 天前   ❤️ 1
    可能是我老了,已经懒得去取笑 C 语言的各种坑和烂梗了。

    毕竟是一门 50 多岁的语言了,半个世纪前的很多东西现在看来没那么严谨,也毫无必要了。为了保证兼容性,也不会改。

    但也不能证明在当时的环境下,这种选择是不对的,是值得被取笑的东西。

    觉得不好不用它就是了。
    shimanooo
        2
    shimanooo  
       8 天前
    你以为 C:高级程序语言
    实际上的 C:加强版汇编
    xuanbg
        3
    xuanbg  
       7 天前   ❤️ 1
    所以你懂高司令了吗?

    高司令:你们总骂 Java 这也要管那也要管,其实我只不过预判了沙雕程序员的恶趣味而已……
    marcong95
        4
    marcong95  
       7 天前
    void ( *signal(int signum, void (*handler)(int)) ) (int);

    形如这种形式的说不上是「类型中置」吧,变量名中置倒是说得过去。所以反而讽刺用的「外置」或者「混合置」反而是合理的~~
    wyntalgeer
        5
    wyntalgeer  
       7 天前
    AI:有趣,爱看
    cnbatch
        6
    cnbatch  
    OP
       7 天前
    @marcong95 记得 V 站以前有人说过,这属于“中缀”表达,严格来讲确实不属于类型中置
    叫做“混合置”反而够形象
    marcong95
        7
    marcong95  
       7 天前
    @cnbatch 中缀也没错,只不过是变量名中缀而已。就像表达式的 5 + 3 是运算符中缀,5 3 +是运算符后缀,+ 5 3 是前缀啥的。
    DOLLOR
        8
    DOLLOR  
       7 天前   ❤️ 1
    借助 typeof ,可以把 C 改得更像前置类型了🐶

    #define Array(T, SIZE) typeof(typeof(T)[SIZE])
    #define Pointer(T) typeof(typeof(T) *)
    #define FP(RETURN, ARGS) typeof(typeof(RETURN)(*) ARGS)

    效果

    // int ai[10]
    Array(int, 10) ai;
    // int *pi
    Pointer(int) pi;

    // int (*pai)[10]
    Pointer(Array(int, 10)) pai;
    // int *api[10]
    Array(Pointer(int), 10) api;

    // void (*fp)(int)
    FP(void, (int)) fp;
    // int *(*fp2)(int *)
    FP(Pointer(int), (Array(int, 10))) fp2;
    // int (*afp[10])(int, int (*)(int))
    Array(FP(int, (int, FP(int, (int)))), 10) afp;

    是不是更清晰一点了🐶😂
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   949 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 21:47 · PVG 05:47 · LAX 14:47 · JFK 17:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.