c++ - 三向比较运算符与减法有何不同?

有一个新的比较运算符 <=>在 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 没有这个问题,但它完全缺乏可读性:以前从未见过这个技巧的人需要一些时间才能理解。 <=>运算符也修复了可读性问题。

这只是新运算符(operator)解决的一个问题。 Herb Sutter's Consistent comparison paper 第 2.2.3 节谈<=>的使用与语言的其他数据类型相减可能会产生不一致的结果。

https://stackoverflow.com/questions/48042955/

相关文章:

c++ - std::tuple get() 成员函数

c++ - queue::push 后双重释放或损坏

c++ - 内存分配是系统调用吗?

c++ - 多行 DEFINE 指令?

c++ - std::vector 与 std::list 与 std::slist 的相对性能?

c++ - 从构造函数的初始化列表中捕获异常

c++ - 在 std::map 中更改元素键的最快方法是什么

c++ - 使用 C++ 基类构造函数?

c++ - 为什么 C/C+ +'s "#pragma once"不是 ISO 标准?

c++ - 为什么优化会杀死这个功能?