#define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \
(((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \
((sb)->sb_flags |= SB_LOCK), 0)
我无法理解最后一个元素"((sb) - > sb_flags | = SB_LOCK),0)"。 " 0"对我来说似乎没用。
答案 0 :(得分:4)
看起来,这里的想法是在执行语句0
的副作用后返回((sb)->sb_flags |= SB_LOCK)
作为表达式结果。该
C comma operator
正在评估它的左侧丢弃结果,并返回右侧。
答案 1 :(得分:3)
没有必要,你有一个需要两个表达式的三元运算符。
它是:
condition ? expression1 : expression2
在你的情况下,你有
(sb->sb_flags & SB_LOCK) ? code : (sb->sb_flags != SB_LOCK, 0)
所以expression2
是(sb->sb_flags != SB_LOCK, 0)
,这意味着
SB_LOCK
sb_flags
0
(这是因为由,
分隔的多个表达式计算为最后一个表达式的值)
从字面上看,您的代码转换为
if (sb->sb_flags & SB_LOCK) {
if (wf == M_WAITOK)
return sb_lock(sb);
else
return EWOULDBLOCK;
}
else {
sb->sb_flags |= SB_LOCK;
return 0;
}