C++中for循环的一个用法

今天发现了C/C++里面for的一个不常见到的用法,来水一篇文章。

今天看到一个技术交流群上面分享了下面这一段代码;

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
using namespace std;

int main(){
string s;
cin >> s;
for(int i = s.size(); i--;){
cout << s[i];
}
cout << endl;
return 0;
}

请注意这一行for(int i = s.size(); i--;){ 乍一看循环根本不能跳出,使用g++编译,发现得到了正确的反向字符串。
我们使用char[]代替string,并跟踪i,发现i实现了递减,并且当(i--)等于0时,循环跳出。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
using namespace std;

int main(){
char s[] = {'a','b','c','d','e'};
for(int i = 5; i--;){
cout << i;
cout << s[i];
}
cout << endl;
return 0;
}

于是得出初步结论,for(A;B;C)语句中,当C为空时,B在更新循环标记的同时起返回值作为循环结束的条件。其作用相当于下面代码中的judge_end函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
using namespace std;

bool judge_end(int & i){
return i-- <= 0 ? false : true;
}

int main(){
char s[] = {'a','b','c','d','e'};
for(int i = 5; judge_end(i);){
cout << i;
}
cout << endl;
return 0;
}