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;
}