我是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}}。
有人可以向我解释这种差异吗?
预先谢谢你。
答案 0 :(得分:2)
仔细查看:cout << ptr << "\n" << ++ptr;
您的代码就像f (ptr, ++ptr);
一样,具有相同的问题。
这两行代码在两个地方分别读取ptr
的值,在一个地方写入ptr
的值。虽然必须在写入之前进行++ptr
的读取,但是ptr
(对于<< ptr
或f
的第一个参数)的读取没有时间限制位置,可以在写入之前或之后进行。
这是因为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(...)
。