C ++为什么用括号?

时间:2013-02-09 19:13:00

标签: 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;

1 个答案:

答案 0 :(得分:5)

回答你的问题:

在您的示例中,除了可读性之外没有区别。

而且,由于这篇文章的评论都是暗示,不要在这里使用括号......

有趣的其他案例

在解除引用的对象上使用属性/方法

另一方面,如果您有类似

的内容,那么就是
*myObject.myPropertyPtr += 10

相比
(*myPointer).myProperty += 10

我在这里选择的名字告诉你区别的是:解除引用运算符*适用于右侧的任何内容;在第一种情况下,运行时将获取myObject.myPropertyPtr的内容,并取消引用,而在第二个示例中,它将取消引用myPointer,并从对象上找到的任何内容中获取myProperty myPointer指向。

后者很常见,甚至有自己的语法:myPointer->myProperty

使用++运算符而不是+=

另一个有趣的例子,我在读完这个问题的另一个(现已删除的)答案之后想到的是这些之间的区别:

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

这更有趣的原因是因为++是一个像其他任何一个调用,特别是不处理左侧和右侧值,它比{{1}的示例更模糊}。 (当然,它们并不总是有意义的 - 有时你最终会尝试在不支持它的对象上使用+=运算符 - 但是如果我们将研究限制为++ s ,这不会是一个问题。无论如何它应该给你一个编译错误......)

由于你引起了我的好奇心,我进行了一个小实验来测试这些。这就是我发现的:

  • int*myPointer++做同样的事情,即 first 增加指针,然后取消引用。这不应该是如此令人惊讶 - 这是我们期望知道运行*(myPointer++)的结果。

  • *myObject.someProperty执行您期望的操作,即首先取消引用指针,然后增加指针指向的任何内容(并保留指针)按原样)。

如果您愿意,请随时仔细查看the code I used to find this out。只需将其保存到(*myPointer)++,使用dereftest.cpp进行编译(假设您已安装G ++)并使用g++ dereftest.cpp -o dereftest运行。