微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针算术表达式是否算作指令?

如何解决指针算术表达式是否算作指令?

我编写了一个程序,该程序可以翻转彼此相邻的数组元素。例如

1,2,1,2变为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};
    oReverse(arr,6);
    for(int i = 0; i < 6; i++){
        std::cout << arr[i] << " ";
    }
    return 0;
}

oReverse()函数负责处理指针魔术。 我无法理解的是:为什么swap(*p,*p++) 将p递增1。 最初,我在for循环中编写了p + = 2,但是效果不佳,但是在p ++中却可以。 我以为程序会交换p和p ++,然后将p加2,然后一次又一次地交换p和p ++。

我希望我已经足够清楚地解释了这个问题。

解决方法

首先,在获取值之后,*p++在{em>之后递增p。所以代替

swap(*p,*p++);

您想这样做:

swap(*p,*++p);

但这也不起作用。该标准没有定义应按什么顺序评估函数的参数。所以代替

swap(*p,*++p);

swap(*p,*(p+1));
p++;

您会很安全。它们的行为不相同,因为评估顺序为is unspecified。但是它们的预期行为是等效的。

“预期行为”是指通常不期望评估顺序未由标准定义的行为。

编辑:

在C ++ 17之前,未指定评估顺序,但是从C++17 it is specified from left to right.起,但是不要那样做。 “聪明”的结构容易引起问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。