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 必须保证正确
}