V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yolee599
V2EX  ›  C

请教一个 newlib 库 SLIST_FOREACH_SAFE 宏的骚操作

  •  
  •   yolee599 · 2022-10-31 20:53:54 +08:00 · 889 次点击
    这是一个创建于 757 天前的主题,其中的信息可能已经有所发展或是发生改变。

    源码来自 newlib-cygwin

    其中有以下一段宏:

    #define	SLIST_FOREACH_SAFE(var, head, field, tvar)       \
    	for ((var) = SLIST_FIRST((head));                    \
    	    (var) && ((tvar) = SLIST_NEXT((var), field), 1); \
    	    (var) = (tvar))
    

    其目的是通过这个宏实现安全遍历链表,可以在遍历的时候删除链表元素。其中 for 循环中的表达式 2 中的目的是当 var 非空的时候就执行后面的赋值 tvar ,若 var 为空执行后面的 SLIST_NEXT 会导致崩溃。我对这里就很不解了,首先这个表达式我没见过,后面一个 1 是什么操作?其次在遍历到最后一个元素的时候 tvar 必然会等于空而跳出循环,但是实际运行得很好。

    4 条回复    2022-10-31 21:17:04 +08:00
    choury
        1
    choury  
       2022-10-31 20:58:27 +08:00 via Android
    这是一个逗号表达式,结果为最后一个逗号后面的值
    nightwitch
        2
    nightwitch  
       2022-10-31 20:59:28 +08:00 via Android
    operator, 从左到右依次执行表达式,并返回最后一个表达式的值
    yolee599
        3
    yolee599  
    OP
       2022-10-31 21:14:24 +08:00 via Android
    @choury @nightwitch 哦哦,明白了,也就是说 && 后面的表达式一定会等于 1 ,这样即使 tvar 为空也不会退出循环,多谢两位
    yolee599
        4
    yolee599  
    OP
       2022-10-31 21:17:04 +08:00 via Android
    查了一下“逗号表达式”,豁然开朗,之前没用过这个运算符
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3549 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:54 · PVG 18:54 · LAX 02:54 · JFK 05:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.