#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」對我來說似乎沒有必要。在C中的條件表達式0
#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」對我來說似乎沒有必要。在C中的條件表達式0
,因爲它似乎,這裏的想法一旦執行語句((sb)->sb_flags |= SB_LOCK)
的副作用,將返回0
作爲表達式結果。 C comma operator 正在評估它的左側丟棄結果,並返回右側。
這不是沒有必要,你有一個三元運算符需要兩個表達式。
它是由:
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;
}