有一个新的比较运算符 <=>
在 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/