C++的经典问题
#include <iostream>
int main() {
int a = -1;
unsigned b = 1;
std::cout << (a > b ? "-1 > 1" : ""); // prints -1 > 1
}
因为继承自C的整型转换规则,宽度相同的整数,有符号数被转换成无符号数,所以-1 > 1
。这是不同符号数运算始终存在的风险
为了避免这种问题,除了位运算之类的特殊操作,一切整型都应该使用有符号数。而且从效率的角度来说,有符号数比无符号数效率更高(因为未定义行为)
但是,由于历史原因,STL中size()
返回的是无符号数,于是造成了一堆丑陋的static_cast
C++20中,终于有了std::ssize()
返回有符号数的大小。但是缺点是,如果写模版的话,应该包含那个头文件呢?
Defined in header <array>
Defined in header <deque>
Defined in header <forward_list>
Defined in header <iterator>
Defined in header <list>
Defined in header <map>
Defined in header <regex>
Defined in header <set>
Defined in header <span>
Defined in header <string>
Defined in header <string_view>
Defined in header <unordered_map>
Defined in header <unordered_set>
Defined in header <vector>