2013-02-09 68 views
0

我發現這個代碼在一本書:C++爲什麼括號?

#include <iostream> 
using namespace std; 

void ChangesAreGood(int *myparam) { 
    (*myparam) += 10; 
    cout << "Inside the function:" << endl; 
    cout << (*myparam) << endl; 
} 

int main() { 
    int mynumber = 30; 
    cout << "Before the function:" << endl; 
    cout << mynumber << endl; 

    ChangesAreGood(&mynumber); 
    cout << "After the function:" << endl; 
    cout << mynumber << endl; 

    return 0; 
} 

它說:

(*myparam) += 10; 

什麼差異將下面的產品?

*myparam += 10; 

回答

5

要回答你的問題:

在你的榜樣,有除了可讀性沒有區別。

而且,隨着這個帖子上的評論都表明,不要使用這裏的括號...

有趣的其他情況下

解除引用的對象上使用屬性/方法

在另一方面,一個區別,如果您有類似

*myObject.myPropertyPtr += 10 

相比

(*myPointer).myProperty += 10 

我選擇這裏的名字告訴你,有什麼區別:在引用操作上無論是在它的右側*工程;在第一種情況下,運行時將獲取myObject.myPropertyPtr的內容,並取消引用:在第二個示例中,它將取消引用myPointer,並從myPointer指向的對象上發現的任何內容獲取myProperty

後者很常見,甚至有它自己的語法:myPointer->myProperty

使用++運營商,而不是+=

另一個有趣的例子,這是我讀另一個(現已刪除)回答了這個問題後認爲,是它們之間的區別:

*myPointer++ 
(*myPointer)++ 
*(myPointer++) 

原因這更有趣的是因爲++是一個類似於任何其他的調用,並且特別不涉及左側和右側的值,所以它比您的示例+=更模糊。 (當然,它們並不總是有意義的 - 有時你最終會試圖在不支持它的對象上使用運算符 - 但如果我們將學習限制爲int s,這不會是一個問題。它應該給你一個編譯器錯誤無論如何...)

既然你抓住了我的好奇心,我做了一個小實驗測試了這些。這是我發現:

  • *myPointer++做同樣的事情爲*(myPointer++),即第一增量指針,然後解引用。這應該不會如此令人驚訝 - 這正是我們所期望的運行*myObject.someProperty的結果。

  • (*myPointer)++做你所期望的,即第一取消引用指針,然後增量無論指針指向(並離開指針是)。

如果您願意,請隨時仔細查看the code I used to find this out。只需將其保存到dereftest.cpp,使用g++ dereftest.cpp -o dereftest(假設您已安裝G ++)進行編譯並使用./dereftest運行。

+9

「除了可讀性之外沒有區別」 - 是的,沒有*括號的可讀性更好。 – 2013-02-09 19:23:29

+2

有一個思想流派(看起來很(流行)(某個())(())(())(())(())(())((聲明))模糊的優先順序(規則)使得),並且((()))括號更多的代碼更具可讀性。)(這樣的人是(((((()))))))。 – 2013-02-09 19:34:38

+0

謝謝,它似乎並不是必要的,但指針可能會非常棘手,所以我想確定一下。 – 2013-02-09 19:54:19