我不明白这里发生了什么。一定有一些与“冲洗”术语有关的东西,但我想要一个解释。
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.
在表达式中
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)
这个排序良好的表达式将呈现预期的输出。
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |