繁体   English   中英

带有指针的 c++ 程序中的奇怪问题

[英]strange problem in a c++ program with pointers

我写了这个简单的 c++ 程序,得到了一些我不明白的奇怪结果(结果在行注释中描述)

int arr[3] {1, 2, 3};
int* p{ nullptr };

p = arr;
std::cout << p[0] << " " << p[1] << " " << p[2]; // prints 1 2 3, OK

p = arr;
std::cout << *(p++) << " " << *(p++) << " " << *(p); // prints 2 1 3 ??

p = arr;
std::cout << *p << " " << *(++p) << " " << *(++p); // prints 3 3 3 ??

p = arr;
std::cout << *p << " "; ++p;
std::cout << *p << " "; ++p;
std::cout << *p; // prints 1 2 3, OK

似乎指针沿 std::cout 连接递增不起作用。 我的想法有什么问题? 我想它应该起作用了。 最好的

最终编辑:我使用的是 c++14,我切换到 c++20,现在它可以正常工作了,谢谢大家!

int* p{ nullptr }; std::cout << p[0] << " " << p[1] << " " << p[2];

这是Undefined Behavior ,因为您正在取消引用nullptrp尚未指向有效的 memory 。

 p = arr; std::cout << p[0] << " " << p[1] << " " << p[2];

这是定义明确的行为。 p指向有效的 memory,总是在取消引用之前递增,并且以确定性和有效的方式递增。 这与您编写以下内容相同:

std::cout << *(p+0) << " " << *(p+1) << " " << *(p+2);
 p = arr; std::cout << *(p++) << " " << *(p++) << " " << *(p); p = arr; std::cout << *p << " " << *(++p) << " " << *(++p);

这两者都是 C++17 之前的未定义行为,因为在早期版本中不保证链式operator<<调用的评估顺序,编译器可以自由地以它想要的任何顺序评估它们。 在 C++17 以后不再是这种情况。

 p = arr; std::cout << *p << " "; ++p; std::cout << *p << " "; ++p; std::cout << *p;

这是定义明确的行为。 p指向有效的 memory,在递增之前总是取消引用,并且以确定性和有效的方式递增。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM