【问题标题】:why TAILQ_FOREACH_SAFE implementation contains ((tvar) = TAILQ_NEXT((var), field), 1)?为什么 TAILQ_FOREACH_SAFE 实现包含 ((tvar) = TAILQ_NEXT((var), field), 1)?
【发布时间】:2020-07-17 13:11:50
【问题描述】:

在使用 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?

【问题讨论】:

  • 这是使用 BSD sys/queue.h 标头吗?

标签: c data-structures queue


【解决方案1】:
((tvar) = TAILQ_NEXT((var), field), 1);

这使用comma operator。对逗号左侧的表达式求值并丢弃其结果,然后对右侧的表达式求值并返回其结果——在本例中为文字 1,因此如果var 为真,则整个@987654324无论tvar 设置为什么,@ 表达式都是正确的,因此for 循环继续它的一部分。当var 不为真时(通过成为NULL 指针)停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2013-12-08
    • 2011-11-30
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多