当索引超过其长度时,C++for循环会自动安全地终止char*

C++ for loop terminated automatically safely for char * when index cross its length

本文关键字:安全 char 终止 循环 C++for 索引      更新时间:2023-10-16

考虑以下循环。

char temp[100];
char *str = "abab";
int i, j;
for (i = 0, j = 0; temp[i] = str[j];j++)
{
    if (str[j] == temp[i])
        i++;
    else
        i--;
}

它不具有终止条件,但在遍历"str"后仍然能够终止。

请解释。

赋值表达式temp[i] = str[j]有一个值,该值是已赋值的值。

由于str结尾(字符值0),因此当循环到达它并将其指定给temp时,表达式的计算结果为0。循环条件变为false。

循环确实有一个终止条件,即

temp[i] = str[j]

由于其值为str[j],循环条件归结为

for (j = 0; str[j]; j++)

这肯定正好遍历str一次,因为在此上下文中str[j]求值为false当且仅当str[j] == ''''是一个特殊字符,用于终止所有字符串文字,并用于终止C风格的字符串。

在"现实世界"中,也就是玩具程序之外,你应该避免像这样的"聪明"代码,即使它有效。

还要注意,从字符串文字到char*的转换是不推荐的,每次修改字符串文字的尝试都会调用未定义的行为。使用

const char *str = "abab";

相反。

条件为temp[i] = str[j]。用于分配和返回分配的值。因此,当到达终止时,对于不同于的所有内容,它将被评估为true,而对于false。

#include <iostream>
using namespace std;
int main()
{ 
    char temp[100];
    const char *str = "abab";
    int i, j;
    for (i = 0, j = 0; temp[i] = str[j]; j++)
    {
        if (str[j] == temp[i])
            i++;
        else
            i--;
    }
    cout << (temp[4]  ? "true" : "false") << endl;
}

打印显示上一次迭代的条件计算结果为false,因为它为零(字符串结尾为"\0")。

从外观上看,循环在扫描整个单词"abab"时运行,循环结束的条件是str=temp,这些变量的最终输出是4=4