为什么((cout << ptr; cout <<“ \ n” << ++ ptr;))和((cout << ptr <<“ \ n” << ++ ptr;))给出不同的结果

时间:2019-09-10 16:08:24

标签: c++ pointers cout

我是c语言的新手,我最近花了几天的时间阅读有关指针的信息。我意识到以下两个代码虽然看起来完全一样,却给了我不同的结果。

第一个代码:

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中,显然总是指向{{ 1}}。
有人可以向我解释这种差异吗?
预先谢谢你。

2 个答案:

答案 0 :(得分:2)

仔细查看:cout << ptr << "\n" << ++ptr;

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

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

这是因为C ++没有指定评估函数参数的顺序。显然,在您的平台上,使用编译器标志,增量恰巧发生在其他读取之前。因此,您将输出增加的值两次。

答案 1 :(得分:1)

现在让我们将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 ++没有指定函数调用的参数求值顺序,因此可以在评估嵌套的ptr函数调用之前先递增f(...)