Tom*_*Gun 1 c++ pointers pointer-arithmetic
我编写了一个程序来翻转彼此相邻的数组元素。例如
1, 2, 1, 2 变成 2, 1, 2, 1
我写的代码是:
#include <iostream>
template <class T>
void swap(T& a, T& b){
T temp = a;
a = b;
b = temp;
}
template <class T>
void oReverse(T* p, int size){
for(T* e = p + size; p < e; p+=1){
swap(*p, *p++);
}
}
int main(){
int arr[] = {1,2,1,2,1,2};
oReverse(arr, 6);
for(int i = 0; i < 6; i++){
std::cout << arr[i] << " ";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该oReverse()函数负责指针魔术。我无法理解的是:为什么将swap(*p, *p++) p 加一。一开始我在for循环里写了p+=2,但是效果不好,但是用p++就可以了。我认为程序会交换 p 和 p++,然后将 p 增加 2,然后一次又一次地交换 p 和 p++。
我希望我把问题解释得够清楚了。
首先,取值后*p++递增。所以代替p
swap(*p, *p++);
Run Code Online (Sandbox Code Playgroud)
你想这样做:
swap(*p, *++p);
Run Code Online (Sandbox Code Playgroud)
但这也行不通。该标准没有定义函数参数的计算顺序。所以代替
swap(*p, *++p);
Run Code Online (Sandbox Code Playgroud)
写
swap(*p, *(p+1));
p++;
Run Code Online (Sandbox Code Playgroud)
你会安全的。它们的行为是不等价的,因为评估顺序是未指定的。但它们的预期行为是等效的。
对于“预期行为”,我的意思是不知道评估顺序未由标准定义的人通常会期望的行为。
编辑:
C++17 之前未指定求值顺序,但从C++17 开始,它是从左到右指定的。但是,还是不要做那样的事情。“聪明”的结构有引起问题的倾向。
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |