c - 为什么 TAILQ_FOREACH_SAFE 实现包含 ((tvar) = TAILQ_NEXT((var), field), 1)?
问题描述
在使用 queue.h MACRO 进行安全遍历时,我有疑问
#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = TAILQ_FIRST((head)); \
(var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
(var) = (tvar))
为什么在((tvar) = TAILQ_NEXT((var), field), 1)
语句中添加tailing 1?
解决方案
((tvar) = TAILQ_NEXT((var), field), 1);
这使用逗号运算符。对逗号左侧的表达式求值并丢弃其结果,然后对右侧的表达式求值并返回其结果——在这种情况下为文字 1,因此如果为真,则无论var
怎样,整个表达式都为真(var) && ((tvar) = TAILQ_NEXT((var), field), 1)
什么tvar
被设置为,所以for
它是循环的一部分继续。它在不正确时停止var
(通过作为NULL
指针)。
推荐阅读
- java - 有人可以用 SamePlaceExceptiona 和 WeightException 的自定义异常类解释这段代码的工作原理吗?
- stata - 条形图的位置
- selenium-webdriver - 在 qmetry 中的驱动程序之间来回切换
- reactjs - 在我的反应钩子页面中单击 Google 登录按钮时,什么也没有发生
- java - Spring Boot Batch - 使用 CompositeItemWriter 停止和启动多线程步骤
- html - 提交表单 Laravel 后根据单选按钮重定向
- javascript - 为什么 localStorage 中的更改直到刷新才更新?
- postgresql - 显示从 psql 函数的主体生成的一些值,如 ES2016 中的 console.log 所做的那样
- c++ - GMock - 来自第三方库的模拟类
- python - 通过在 python 中使用部分匹配比较来自不同数据帧的 2 列来映射值