在 C 中,以下代码片段会生成意外的输出"Greater":
#include <iostream> #include <vector> int main() { std::vector<int> a; std::cout << "vector size " << a.size() << std::endl; int b = -1; if (b < a.size()) std::cout << "Less"; else std::cout << "Greater"; }
输出:
vector size 0 Greater
这种违反直觉的行为背后的原因在于所比较的值之间的类型差异。 a.size() 返回一个无符号整数,表示向量的非负大小。另一方面,b 是一个有符号整数,持有负值 -1。
比较这两个值时,C 执行隐式提升为无符号。结果,b 被提升为一个大的无符号整数,然后与无符号的 a.size() 进行比较。大的无符号值超过 0,导致“更大”输出。
可以通过以下代码进一步说明此行为:
#include <iostream> int main() { unsigned int a = 0; int b = -1; std::cout << std::boolalpha << (b < a) << "\n"; }
输出:
false
这里,我们直接将无符号类型 (a) 与有符号类型进行比较(b).负值 b 被提升为一个大的无符号整数,它被正确地认为大于值为 0 的无符号 a。
理解类型差异和隐式提升规则是对于在 C 中处理有符号和无符号值至关重要。在比较不同类型的整数时,重要的是要考虑它们的提升方式以及结果比较是否有意义。
以上是为什么在 C 中将 -1 与空向量的大小进行比较会导致'更大”?的详细内容。更多信息请关注PHP中文网其他相关文章!