cout 表达式中的增量地址呈现意外输出

Căt*_*rbu 1 c++ cout

我不明白这里发生了什么。一定有一些与“冲洗”术语有关的东西,但我想要一个解释。

int arr[4] {3,8,1,6};

cout<<arr[0];
cout<<arr[1];
cout<<arr[2];
cout<<arr[3];

cout<<endl;

cout<<&arr[0]<<endl;
cout<<&arr[1]<<'\n';
cout<<&arr[2]<<endl;
cout<<&arr[3]<<endl;

cout<<&arr[0]<<endl;

int *j = &arr[0];
cout << *j << *(++j) << *(++j) << *(++j); // HERE IS THE PROBLEM
Run Code Online (Sandbox Code Playgroud)

为什么最后一条cout指令倾向于输出相反的数字?在我看来,我喜欢回溯,但我不确定。

我期待3816作为输出,而不是我得到6618.

ana*_*ciu 5

在表达式中

cout << *j << *(++j) << *(++j) << *(++j);
Run Code Online (Sandbox Code Playgroud)

评估顺序没有明确定义,因此行为是 undefined

未定义行为的示例包括数组边界外的内存访问、有符号整数溢出、空指针取消引用、在没有任何中间序列点的表达式中对同一标量进行多次修改(C++11 前)且未排序(自 C+ +11)

运行它并输出3816. 请注意,编译器会检测到警告标志。

如果你试试:

cout << *j;
cout << *(++j);
cout << *(++j); 
cout << *(++j);
Run Code Online (Sandbox Code Playgroud)

这个排序良好的表达式将呈现预期的输出。