for循环和while循环遇到的bug(有无符号的数之间的比较)

这样的代码可能基础薄弱的同学(没错就是在下,今天查bug查了半天才发现)经常这么用for(int i=0;i<a.length();i++)

不想看废话的可以直接看最下面结论

这样的代码看似没有毛病,但是codeblocks给了一个警告
warning:comparison between signed and unsigned integer expressions
啥意思呢?就是

以上表达式是 有符号的变量 与 无符号变量 的比较

i是int类型,是有符号的,而a.length()返回的是一个无符号的数,当i>=0的时候,自然没有任何问题,但是当i是负数的时候,问题就大了,例如这段代码

    string a="123";
    for(int i=-1;i<a.length();i++)
        cout<<i<<" ";
    return 0;

代码很简单,输出却很特别,输出不是0 1 2,
在这里插入图片描述

结果没有任何输出

原因:有符号数和无符号数之间不能比较!!

这里说的有无符号并不是正负数之间不能比较,而是定义的时候int与unsigned int之间不能比较,两个都是正数的话运行还没有什么问题

当有符号数是负数时,程序会自动终止,例如

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int i=-1;
    unsigned int j=1;
    if(j>i)cout<<"yes";
    else cout<<"no";
    return 0;
}

运行结果

在这里插入图片描述

yes 和 no都没有输出,说明程序自动终止了

阔怕,以后还是不要这么用了,正确示范:

    string a="123";
    int t=a.length();
    for(int i=-1;i<t;i++)cout<<i<<" ";
    return 0;

把a.length()赋值给有符号的变量t
在这里插入图片描述

完全没毛病

结论:尽量不要将unsigned类型的数与signed类型数相比较,当signed类型的数为负数时,会导致程序运行终止

猜你喜欢

转载自blog.csdn.net/zhoucheng_123/article/details/104412993