为什么#1程序显示运行时错误,而#2运行正常?

时间:2017-03-01 12:28:39

标签: string

string str="";
for(int j=0;j<str.size()-1;++j)
{
        char t=str[j];
        cout<<"here";
}

string str="";
int s=str.size();
--s;
for(int j=0;j<s;++j)
{
        char t=str[j];
        cout<<"here";
}

1。为什么#1&#34; for loop&#34;不会以#2结束?这些有什么区别?

1 个答案:

答案 0 :(得分:0)

str.size返回一个无符号数。应该有一个警告,但是0 - 1作为无符号数将改为最大数。这会导致你的第一个循环永远运行(同样,应该有关于比较签名的无符号的警告),或者更可能的是崩溃,因为你正在访问字符串边界之外的东西。

在你的第二个例子中,你将无符号零转换为有符号零(int已签名),然后递减它,因此它的行为与你期望的一样。

一般情况下,在启用警告的情况下编译代码(强烈建议我在第一个示例中发出两个警告,无符号vs签名以及不太重要的t未使用)。