C++ 20中有一个新的比较运算符<=>。但是,我认为在大多数情况下,简单的减法效果很好:

int my_strcmp(const char *a, const char *b) {
    while (*a == *b && *a != 0 && *b != 0) {
        a++, b++;
    }
    // Version 1
    return *a - *b;
    // Version 2
    return *a <=> *b;
    // Version 3
    return ((*a > *b) - (*a < *b));
}

它们具有相同的效果。我真的不明白区别。

最佳答案

运算符解决了用减法得到的数值溢出的问题:如果从接近INT_MIN的负数中减去一个大的正数,则会得到一个无法表示为int的数字,从而导致不确定的行为。

尽管版本3摆脱了这个问题,但它完全缺乏可读性:以前从未见过此技巧的人可能需要一些时间来理解。 <=>运算符也解决了可读性问题。

这只是新运营商解决的一个问题。 Herb Sutter's Consistent comparison paper的第2.2.3节讨论了<=>与该语言的其他数据类型的使用,在这些数据类型中,减法可能会产生不一致的结果。

关于c++ - 三向比较运算符与减法有何不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48042955/

10-12 23:57