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

问题代码

#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 = 无符号类型

第一个问题

第二个问题

猜你喜欢

转载自www.cnblogs.com/VividBinGo/p/12241945.html