码迷,mamicode.com
首页 > 编程语言 > 详细

C++ | 使用 xxx.size() 作为循环条件的问题

时间:2020-01-30 12:43:53      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:运行   str   display   name   lock   auto   idt   family   xxx   

问题代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s="a";

    printf("%d\n",s.size()-5);
    cout<<s.size()-5<<endl;

    for(int i=0;i<=s.size()-5;i++)
        printf("ViVid-BinGo\n");

    system("pause");
    return 0;
}

 

技术图片

  

  以上是问题代码的运行结果,这是就会有问题出现了。

  ① 字符串 s 的大小为 1 ,那么 s.size() - 5 == -4。但是用 print("%d") 和 cout 输出 s.size() - 5 的结果分别为 -4 和 18446744073709551612 ,显然结果并不相同。

  ② 不严谨的说,for循环中判断条件 0 <= -4 显然不成立,那么一句 “ViVid-BinGo” 也不会输出。但是通过运行结果可以看出,“ViVid-BinGo” 被输出出来了,而且不止输出了一次。

解决

技术图片

 

  可以从C++参考手册中看到,s.size() 的返回值为无符号整型。那么我们可以想到,与 s.size() 进行运算的 -5 是个有符号整型。

  当出现不同类型的变量参与运算时,那么低级类型会向上转换以至于达到同一个类型,在这里因为无符号类型比有符号类型级别高,所以 -5 应该先转换到无符号类型,然后再和 s.size() 运算。

  因为有符号类型 + 2^n = 无符号类型

 

 

第一个问题

 

第二个问题

C++ | 使用 xxx.size() 作为循环条件的问题

标签:运行   str   display   name   lock   auto   idt   family   xxx   

原文地址:https://www.cnblogs.com/VividBinGo/p/12241945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!