C中的条件表达式

时间:2015-12-31 16:55:40

标签: c network-programming

#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"对我来说似乎没用。

2 个答案:

答案 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;
}