C++中if无法正常判断的问题。

Emmm,今天在刷leetcode的时候出了个奇怪的问题。

//temp-(i*2)是一个int类型,s为string类型
if( temp-(i*2) >= s.length())
    break; 

这条if语句总是判断为true,然后break。但我在if后面输出两个变量的值的时候,temp-(i*2)
明显小于s.length()啊。

图片说明

但如果这样修改的话,程序就可以正常执行了

int length = s.length();
if( temp-(i*2) >= length)
    break; 

但这到底是为什么。。。?

s.length() 返回值是size__type 不是int,强转之后再比较是没问题的,所以你看到了两个不同的运行结果_。

编译器优化问题?有没有更详细的代码啊,比如s是怎么赋值的,if前后的处理逻辑是什么

 string convert(string s, int numRows) {
        int n = numRows;
        int count = 0;
        int i = 0;
        int length = s.length();
        string res = "";
        if(n == 1)
            return s;
        while(count < s.length()){
            if(i==0||i==n-1){ 
                int temp = i;
                while(1){
                    if(temp >= length )
                        break;
                    res += s[temp];
                    count ++;
                    temp += (2*n-2);
                }
            }
            else{
                if(i >= s.length())
                    break; 
                else{
                     int temp = i;
                    while(1){
                        if( temp-(i*2) >= s.length()){
                            cout << "temp-(i*2):" << temp-(i*2) << endl;
                            cout << "s.length():" << s.length() << endl;
                            break;
                        }
                        else if(temp != i){
                            res += s[temp-(i*2)];
                            count ++;
                        }
                        if(temp >= length )
                            break;
                        else{
                            res += s[temp];
                            count ++;
                            temp += (2*n-2);
                         }
                     }
                 }
              }
            i++;
          }
        return res;
     }

唯一的解释就是,你数组越界了,而temp、i正好在数组后面,越界以后会破坏它们的值。之所以你下面的写法可以,是一个偶然,因为任何代码的改变,编译器分配的地址都不同。不是什么“优化”的问题。

size_type为无符号类型,int为有符号类型,比较时会直接将有符号类型转变为无符号类型,即负的变正