C++为什么用括号?

Cod*_*ith 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;
}
Run Code Online (Sandbox Code Playgroud)

它说:

(*myparam) += 10;
Run Code Online (Sandbox Code Playgroud)

以下产生的不同之处是什么?

*myparam += 10;
Run Code Online (Sandbox Code Playgroud)

Tom*_*han 5

回答你的问题:

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

并且,正如这篇文章的评论都暗示的那样,不要在这里使用括号...

有趣的其他案件

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

另一方面,如果你有类似的东西,则会有所不同

*myObject.myPropertyPtr += 10
Run Code Online (Sandbox Code Playgroud)

相比

(*myPointer).myProperty += 10
Run Code Online (Sandbox Code Playgroud)

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

后者非常普遍,甚至有自己的语法:myPointer->myProperty.

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

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

*myPointer++
(*myPointer)++
*(myPointer++)
Run Code Online (Sandbox Code Playgroud)

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

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

  • *myPointer++做同样的事情*(myPointer++),即首先递增指针,然后取消引用.这不应该是如此令人惊讶 - 这是我们所期望的运行结果*myObject.someProperty.

  • (*myPointer)++做你期望的,即首先取消引用指针,然后递增指针指向的任何内容(并将指针保持原样).

如果你愿意的话,请随便仔细看看我用过的代码.只需保存dereftest.cpp,编译g++ dereftest.cpp -o dereftest(假设您已安装G ++)并运行./dereftest.

  • "除了可读性之外没有区别" - 是的,没有*括号的可读性*更好. (9认同)
  • 有一种思想流派(似乎(非常(流行)(在(())(())程序员组中(())喜欢(声称()声称优先级(规则)模糊(括号过多)必要的,带((()))更多括号的代码更具可读性.)(这些人是((((((((((错误)))))))))))))). (2认同)