为什么 ( ( cout << ptr; cout << "n" << ++ptr; )) 和 ( ( cout << ptr << "

why do (( cout << ptr; cout << " " << ++ptr; )) and (( cout << ptr << " " << ++ptr; )) give different results

本文关键字:lt cout ptr 为什么 ++ptr      更新时间:2023-10-16

我是 c++ 的新手,我最近花了几天时间阅读有关指针的信息。我意识到以下 2 个代码给了我不同的结果,尽管它们看起来相同。

第一个代码:

int a = 5;
int* ptr = &a;
cout << ptr;
cout << "n" << ++ptr;

第二个代码:

int a = 5;
int* ptr = &a;
cout << ptr << "n" << ++ptr;

这是第一个的输出:

0043F940
0043F944

第二个的输出:

003AFE20

003AFE20

第一个对我来说似乎更合乎逻辑,因为它首先输出a的地址,然后输出下一个整数位置的地址。但在第二个中,ptr显然总是指向a.
有人可以向我解释这种差异吗?
提前谢谢你。

仔细观察:cout << ptr << "n" << ++ptr;

您的代码就像f (ptr, ++ptr);一样,具有相同的问题。

这两行代码有两个读取ptr值的位置和一个写入ptr值的位置。虽然读入++ptr必须在写入之前进行,但读取ptr(对于<< ptr或要f的第一个参数(对读取的时间没有限制,可以在写入之前或之后进行。

这是因为C++没有指定计算函数参数的顺序。显然,在您的平台上,使用编译器标志,增量恰好发生在另一个读取之前。因此,您可以输出两次递增的值。

现在让我们将operator<<(a, b)命名为函数f(a, b)。 使用此表示法cout << 5变得f(cout, 5).利用<<运算符具有从左到右关联性的事实,cout << 4 << "a"变得f(f(cout, 4), "a")

让我们翻译您的代码:

cout << ptr << "n" << ++ptr;

自:

f(f(f(cout, ptr), "n"), ++ptr);

如您所见,对f的最外部调用作为第二个参数++ptr。由于 C++ 没有指定函数调用参数的计算顺序,因此在计算嵌套的函数调用之前,可以先递增ptrf(...)