源码来自 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 必然会等于空而跳出循环,但是实际运行得很好。
1
choury 2022-10-31 20:58:27 +08:00 via Android
这是一个逗号表达式,结果为最后一个逗号后面的值
|
2
nightwitch 2022-10-31 20:59:28 +08:00 via Android
operator, 从左到右依次执行表达式,并返回最后一个表达式的值
|
3
yolee599 OP @choury @nightwitch 哦哦,明白了,也就是说 && 后面的表达式一定会等于 1 ,这样即使 tvar 为空也不会退出循环,多谢两位
|
4
yolee599 OP 查了一下“逗号表达式”,豁然开朗,之前没用过这个运算符
|