假设我有此(C ++或也许C)代码:

vector<int> my_vector;
for (int i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

如果它做的权利我不在乎。最重要的部分是在for循环声明。 编译器给出了这样的符号/无符号不匹配,因为尺寸()返回一个unsigned int,而不是一个一个签。如何重要的是它改变i无符号?我宣布循环计数器作为整数出于习惯,但如果这是一个潜在的错误,我会强迫自己走出习惯。

有帮助吗?

解决方案

我会说这是非常重要的 - 你应该警告作为错误进行编制,努力解决所有警告。如果你这样离开代码中的问题,很容易陷入无视警告,或者让误报这样淹没了警告,表示实际问题的习惯。

在这种情况下,此特定错误,它可能不是一个大问题 - 在32位平台上,你不得不在向量超过2个十亿条目之前未签名会包装成带负号的值。为了得到一个向量这样会耗尽所有的内存,因此它可能无法进入的状态下,符号/无符号不匹配会的问题。

其他提示

从技术上讲,i应该是一个vector<int>::size_type。你应该在你的代码中使用typedefs的习惯:

typedef vector<int> VectorType;
VectorType my_vector;
for (VectorType::size_type i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

现在,如果我们将其更改为deque,我们只改变一个线。即使是一些具有古怪SIZE_TYPE定制的容器,你得到的温暖,模糊的感觉,一切都会好的。这是值得很多。即使只是未签名/签名的,也有使用符号/无符号的转换,将不可避免地回来咬你一些棘手的问题,推广

这可以是在该载体的尺寸超过INT_MAX万一重要。如果载体的大小比可在签署int表示的最大值,则你的循环不会终止。

那么,它很重要,因为有符号整数有迹象,所以我可以去所有的方式成为一个负值,那么无论它有多大,它仍然是小于大小(),这可是没有任何迹象。

  

11111111 <千万

在你的榜样的大多数情况下,都不会有问题。但是当你的程序不能正常工作,你做的第一件事情(或应该)是要确保没有警告,所以这是一个机会,不值得考虑。

请确保有尽可能少的警告越好。

正如上面所说的,使用矢量:: size_type的;或通过您的载体使用一个迭代循环。 确保处理所有自己的警告视为错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top