为什么比较运算的结果值与数学上相同的公式不同?

Jeo*_*Nam 13 c++ gcc

我在比较向量和简单常量的大小时遇到​​问题-1

我相信这两者在逻辑上是相同的:

  • (index >= (arr.size() - 1))
  • ((index + 1) >= arr.size())

但是,第一个返回1not 0。两者比较有什么区别?

#include <iostream>
#include <vector>

using namespace std;

int main() {
  int index = -1;
  vector<char> arr(6);
  cout << (index >= (arr.size() - 1)) << endl;
  cout << ((index + 1) >= arr.size()) << endl;
}
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 18

arr.size方法返回无符号整数类型,因此比较右侧的类型是无符号的。这会导致左侧被转换为无符号。

当左边的值为 -1 时,它会转换为一个非常大的无符号数,导致第一个比较为 true。在第二种情况下,左边的值为 0,因此在转换为无符号类型时不会改变,并且比较结果为 false。

如果您使用-Wall -Wextra它进行编译,则会警告您有关有符号/无符号比较的信息。