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

2022-10-31 20:53:54 +08:00
 yolee599

源码来自 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 必然会等于空而跳出循环,但是实际运行得很好。

791 次点击
所在节点    C
4 条回复
choury
2022-10-31 20:58:27 +08:00
这是一个逗号表达式,结果为最后一个逗号后面的值
nightwitch
2022-10-31 20:59:28 +08:00
operator, 从左到右依次执行表达式,并返回最后一个表达式的值
yolee599
2022-10-31 21:14:24 +08:00
@choury @nightwitch 哦哦,明白了,也就是说 && 后面的表达式一定会等于 1 ,这样即使 tvar 为空也不会退出循环,多谢两位
yolee599
2022-10-31 21:17:04 +08:00
查了一下“逗号表达式”,豁然开朗,之前没用过这个运算符

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/891582

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX