c++表达式求值顺序

来源:互联网 发布:访客网络还是 编辑:程序博客网 时间:2024/04/30 18:55

今天写了一个搜索函数,碰到了一个有关表达式求值顺序的bug,看下面两段代码,这是为一个向量写的一个搜索函数,输入一个值,然后返回这个值在向量中的秩Rank,如果该值在向量中存在多个,返回最大的,找不到返回-1

template<typename T>Rank yVector<T>::find(const T &e) const{    Rank cmp = _size - 1;    while ((e != _elem[cmp]) && (cmp--));    return cmp;}
template<typename T>Rank yVector<T>::find(const T &e) const{    Rank cmp = _size - 1;    while ((cmp--) && (e != _elem[cmp]));    return cmp;}

上面的两段代码中第一段能够实现相应功能,第二段有点问题,问题在于当输入的值位于向量的末端时,它就找不到了。原因跟c++表达式求值顺序有关,在c++中,逻辑与&&运算符规定先求左侧运算符的值,只有当左侧运算符的值为真时才求右侧运算符的值。 由于这条规则,在执行while ((cmp--) && (e != _elem[cmp])); 这一句时,会先计算cmp–,然后,使得cmp的值在刚开始就减一,导致右侧的_elem[cmp]跳过向量中最后一个值。