gpt4 book ai didi

C++ 为什么要有括号?

转载 作者:太空宇宙 更新时间:2023-11-04 16:23:13 25 4
gpt4 key购买 nike

我在一本书中找到这段代码:

#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;

最佳答案

回答你的问题:

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

而且,正如这篇文章的评论所暗示的那样,不要在此处使用括号...

其他有趣的案例

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

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

*myObject.myPropertyPtr += 10

相比于

(*myPointer).myProperty += 10

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

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

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

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

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

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

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

  • *myPointer++*(myPointer++) 做同样的事情,即首先递增指针,然后 取消引用。这不足为奇 - 这是我们期望知道运行 *myObject.someProperty 的结果。

  • (*myPointer)++ 做您期望的事情,即首先取消对指针的引用,然后递增指向的指针(并保持指针不变)。

随时仔细查看 the code I used to find this out如果你想。只需将它保存到 dereftest.cpp,使用 g++ dereftest.cpp -o dereftest 编译(假设您安装了 G++)并使用 ./dereftest 运行>.

关于C++ 为什么要有括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14790585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com