您的位置:首页 > 其它

自加自减运算符

2016-05-26 22:21 239 查看

1. i=i++

int count = 0;
for (i = 0; i < 10; ++i)
{
count = count ++;
}


注意,无论循环多少次,最终的 count 的值都是 0.

count++; 执行完成之后,count == 1, 但该表达式的返回值为 0,也就是 count 又重新赋值为 0,将以前自加得到的值又覆盖掉了.

2. 自加自减运算符与循环

int a[] = {1, 2, 3, 4, 5};
int i = 0;
while (i < 5){
cout << a[++i] << endl;
}


(1)循环控制次数;

(2)初值+次数:最终的访问区间;

本例而言,访问的是
a[1] ~ a[5]
,显然
a[5]
访问越界,输出垃圾值。

// 这样才是对的
while (i < 5){
cout << a[i++] << endl;
}
// 显然循环退出时, i 的值为5,指向越界的位置


一定要注意退出循环时,一些变量的值的变化情况,尤其是内部含有自加自减等操作。

template <typename T>
int Vector<T>::remove(Rank lo, Rank hi){

if (lo == hi) return 0;
while (hi < _size) {
_elem[lo++] = _elem[hi++];
}

// 循环退出时
// 1. hi == _size
// 2. lo 和 hi 是同步增长的,也即此时的 lo 和 hi 的值已不是开始的值,但区间的长度是一致的
// 3. 进入循环的次数为 _size - hi
// 4. 循环退出时,lo 和 hi 均指向`越界`的位置
_size = lo;
shrink();
return hi - lo;
}


再来看一个示例:

template <typename T>
Rank Vector<T>::find(T const& e, Rank lo, Rank hi){
while (--hi >= lo && e != _elem[hi]);
return hi;
// 最终退出循环时
// 要么 hi < lo
// 要么 e == _elem[hi] 同时 hi >= lo
这就要联想到布尔表达式的短路性质,A && B,当需要判断 B 时,A 必须保证正确
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: