2013-02-09 65 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