2009-12-16 111 views
7

我只是寫了下面的代碼行:正確使用

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1 

我的意圖是遞增的數據結構中的count變量data_ptr點然後再與threshold進行比較,並且這一行代碼有效。

如果我不是想在進行比較之前增加data_ptr,我會寫這樣的:

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2 

出於好奇,我也試了這行代碼:

if (++data_ptr->count > threshold) { /*...*/ } // example 3 

而且發現它的行爲與第一個完全相同。

第一個問題:爲什麼沒有示例#3的工作方式與示例#1相同?這是運營商優先的問題嗎?標準中的東西?我不得不寫一個快速測試程序,因爲答案對我來說並不明顯。

第二個問題:我應該用不同的方式寫這個if陳述嗎?我可以先在自己的行上執行增量,然後測試條件以避免任何可能的混淆。這是必要的,還是前兩個例子自己顯而易見?

回答

11

1)優先

2)優先

+3

1簡潔。 '' –

3
  1. - >運算符綁定比++更緊密。
  2. 他們都很好定義,我認爲他們很容易閱讀。如果你在同一個表達式中增加了對data_ptr的引用,那麼事情就會變得狡猾。
5

是的,這是一個運算符優先級的問題。箭頭運算符has higher precedence比增量運算符。

要回答你的第二個問題,我想這種類型的構造出一般分成兩個單獨的語句:

++(data_ptr->count); 
if(data_ptr->count > threshold) { /*...*/ } 

這強調了是怎麼回事,並消除可能的混淆。但是,這可能是一個偏好問題。

5
  1. 運算符優先級決定了你所觀察到的行爲。
  2. 如果你在這個例子中將增量與比較分開,但是有時候你想要在條件序列的中間有一個增量的條件,然後嘗試將增量與測試分開可以通過引入否則將不必要的嵌套來傷害代碼的可讀性。

例如:

if (...1...) 
    ...2... 
else if (++data_ptr->count > threshold) 
    ...3... 
else 
    ...4... 

對戰:

if (...1...) 
    ...2... 
else 
{ 
    ++data_ptr->count; 
    if (data_ptr->count > threshold) 
     ...3... 
    else 
     ...4... 
}