gpt4 book ai didi

c++不合逻辑> =处理vector.size()时的比较很可能是由于size_type未签名

转载 作者:搜寻专家 更新时间:2023-10-31 00:42:18 27 4
gpt4 key购买 nike

在处理 vector.size() aka size_type 时,我需要一些帮助来澄清这个奇怪的比较

vector<cv::Mat> rebuiltFaces;
int rebuildIndex = 1;
cout << "rebuiltFaces size is " << rebuiltFaces.size() << endl;

while( rebuildIndex >= rebuiltFaces.size() ) {
cout << (rebuildIndex >= rebuiltFaces.size()) << " , " << rebuildIndex << " >= " << rebuiltFaces.size() << endl;
--rebuildIndex;
}


我从控制台得到的是

rebuiltFaces size is 0
1 , 1 >= 0
1 , 0 >= 0
1 , -1 >= 0
1 , -2 >= 0
1 , -3 >= 0

如果非要我猜的话,我会说编译器盲目地将 rebuildIndex 强制转换为 unsigned 和 +- 但会导致行为异常,但我真的不确定。有人知道吗?

最佳答案

正如其他人所指出的,这是由于C++ 在比较具有不同值的值时适用违反直觉的规则签名;该标准要求编译器将两个值都转换为 unsigned .出于这个原因,通常认为最佳做法是避免unsigned除非你在做位操作(实际数值无关)。遗憾的是,标准容器不要遵循这个最佳实践。

如果你不知何故知道 vector 的大小永远不会溢出 int , 然后你可以只转换 std::vector<>::size() 的结果到 int并完成它。然而,这并非没有危险。作为马克吐温说:“杀死你的不是你不知道的东西,而是你知道的东西确定那不是真的。”如果没有验证什么时候插入到 vector 中,那么一个更安全的测试是:

while ( rebuildFaces.size() <= INT_MAX
&& rebuildIndex >= (int)rebuildFaces.size() )

或者如果您真的不希望出现这种情况,并且准备中止的话发生,设计(或找到)一个checked_cast功能,并使用它。

关于c++不合逻辑> =处理vector.size()时的比较很可能是由于size_type未签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12152605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com