2015-12-31 66 views
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

回答

4

,因爲它似乎,這裏的想法一旦執行語句((sb)->sb_flags |= SB_LOCK)的副作用,將返回0作爲表達式結果。 C comma operator 正在評估它的左側丟棄結果,並返回右側。

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