用于显示 "One" 值的 For 循环与 While 循环 (CS50)

For Loop vs While Loop for Displaying "One" Value (CS50)

观看 CS50 讲座的第 2 周(此处:https://video.cs50.net/2016/fall/lectures/2?t=84m33s),他通过 运行 对字符串的字符进行 while 循环来重新实现 strlen ,使用此循环(已编辑其他代码):

string s = get_string();
int n = 0;
while (s[n] != '[=11=]')
{
    n++;
}
printf("%i",n);

我的问题是:上面的内容可以在for循环中表述吗?

我试图创建一个,但由于 for 循环的格式化方式,它似乎在每次迭代后强制输出,这与允许一个输出的 while 循环不同循环,一旦满足特定条件。

我很好奇 for 循环是否可以在这种情况下实现相同的 "one-time, conditional" 输出。如果我没记错的话,while 是 C lang 独有的,而 Python 等其他语言则专门有 for 循环(如果我错了请告诉我!)。

同样可以用for循环来写。例如

string s = get_string();
int n = 0;
for ( ; s[n] != '[=10=]'; n++ );
printf("%i",n);

然而,这个带有空子语句的 for 循环可能会混淆代码的 reader,即使它是这样写的

for ( ; s[n] != '[=11=]'; n++ ) /* empty body */;

for ( ; s[n] != '[=12=]'; n++ ) { / *empty body */ }

通常同样的事情可以有多种不同的方式。你应该 select 一个更具表现力的结构。对于此任务,最好使用 while 循环。

考虑到变量 n.

使用类型 size_t 而不是类型 int 会更正确

例如

string s = get_string();
size_t n = 0;
for ( ; s[n] != '[=13=]'; n++ );
printf("%zu",n);

此代码也适用于这种情况:

int n=0;
for(;s[n];n++);
printf("%d ",n);

这是如何工作的:

字符串元素有ASCII值,所以直到字符串中有字符,for循环的条件部分为真。当它到达字符串的末尾,即 '\0'('\0' 的整数值为零)时,条件失败,循环退出。