【问题标题】:String.size() won’t infinite loopString.size() 不会无限循环
【发布时间】:2020-08-21 14:15:03
【问题描述】:

所以我不知道实际上是不是 size() 函数导致了这种情况,但每当我运行这段代码时,我都希望它无限循环,但事实并非如此。我正在使用 c++ 和 Visual Studio。

string name = “Devin”;
for(int i = 4; i < name.size(); i—-)
{
  printf(“%c”, name[i]);
}

【问题讨论】:

  • 请注意,您正在比较有符号和无符号整数。
  • 这段代码不会无限循环,因为它会因为非标准引号和缺少分号而导致编译错误。
  • name.size() 返回无符号类型。在评估 i &lt; name.size() 时,i 被提升为该类型。当i 变为负数时,转换进行模运算,因此将-1 转换为无符号类型的结果是无符号类型可以表示的最大值。该值永远不会小于name.size() 可以返回的值,因此当i 达到-1 的值(即第6 次迭代)时循环将停止。
  • @Peter 您的评论不适合作为评论。它应该是一个答案:)
  • @Peter 谢谢!这是有道理的

标签: c++ size infinite-loop


【解决方案1】:

考虑这样的代码:

string name = "Devin";
for(int i = 4; i < name.size(); i--)
    cout<< name[i]<<" i :"<<i<<"\n";

你的输出是

n i :4
i i :3
v i :2
e i :1
D i :0

因为 在比较signedunsigned 时,编译器将signed 值转换为unsigned。对于平等,这并不重要,-1 == (unsigned) -1。对于其他比较,它很重要,例如以下情况属实:-1 &gt; 2Uname.size()unsignedi 现在是 unsigned 号码,循环结束。为了更好地理解;我使用5 而不是name.size() 因为"Devin" 长度是5

for(int i = 4; i < 5; i--)
    cout<< name[i]<<" i :"<<i<<"\n";

输出是:

// Your i is going to negetive and infinity loop like 
i : -1 
i : -2
.
.
.
// and maybe you got segmentation fault (core dumped)
// Because your string just have 5 indexes 

【讨论】:

  • 你需要解释为什么Because name.size() is unsigned and -1 is a signed number .会导致循环停止。这就是 OP 一开始就感到困惑的地方。
  • 比较有符号和无符号时,编译器会将signed 值转换为unsigned。对于平等,这并不重要,-1 == (unsigned) -1。对于其他比较,它很重要,例如以下情况属实:-1 &gt; 2U
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2017-08-19
  • 2010-10-23
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多