【发布时间】:2020-02-21 20:38:46
【问题描述】:
我发现以下程序的意外输出。
这里的指针ptr指向变量i的地址,i持有值10。这意味着ptr 也意味着10 的值。下一个ptr 递增一次。这意味着现在它持有价值11。但是在下面的程序中 ptr 会打印出12。
#include <iostream>
using namespace std;
int main()
{
int i = 10;
int *ptr = &i;
int j = 2;
j += *ptr++;
cout<<"i : "<<i<<"\n";
cout<<"j : "<<j<<"\n";
cout<<"ptr : "<<*ptr<<"\n";
}
i : 10
j : 12
ptr : 12
所以我不明白为什么ptr 打印12 而不是11?
【问题讨论】:
-
未定义的行为可以做各种疯狂的事情。
-
请选择一个标签。这是 C 还是 C++?
-
未定义的行为。由于operator precedence,
*ptr++被解析为*(ptr++)。一定有一个副本,在某个地方,除非我的记忆在欺骗我.. -
既然您期望
11,您是否打算使用(*ptr)++? -
ptr永远不会持有值 10 -*ptr会。打印ptr、&i + 1和&j并进行比较。
标签: c++ pointers undefined-behavior post-increment