c++奇怪的std::cout使用指针的行为

c++ strange std::cout behaviour using pointers

本文关键字:指针 cout std c++      更新时间:2023-10-16

可能的重复:
cout<lt;c++<lt;c

我刚输入文本,突然注意到了。

#include <iostream>
int main()
{    
int array[] = {1,2,3,4};                 
int *p = array;
std::cout << *p << "___" << *(p++) << "n";
// output is  1__1. Strange, but I used  brackets! it should be at
// first incremented, not clear.
p = array;

std::cout << *p << "___" << *(++p) << "n";
// output is 2_2   fine, why first number was affected? I didn't intend 
// to increment it, but it was incremented
p=array;

std::cout << *p << "___" << *(p + 1) << "n";
// output is 1_2 - as it was expected
p = array;
return 0;
}

这种行为对我来说很奇怪,为什么会这样?

您正在导致未定义的行为,所以任何事情都可能发生,没有必要猜测原因。

表达式

std::cout<<*p<<"___"<<*(p++)<<"n"

举个例子:<<之间所有事物的求值顺序都是未指定的,因此*p*(p++)是不按顺序排列的(即编译器不需要先做任何一个)。你不允许修改一个变量,然后在没有修改和使用顺序的情况下使用它,因此这会导致未定义的行为。

同样的事情也适用于该程序中的所有其他地方,在这些地方,变量被修改并在同一表达式中单独使用。