C++ “;有符号/无符号不匹配”;循环递减的警告(C4018) =0;--i)//确定 { 如果(i0;--i) { if(i
使用适当的类型(C++ “;有符号/无符号不匹配”;循环递减的警告(C4018) =0;--i)//确定 { 如果(i0;--i) { if(i,c++,visual-c++,C++,Visual C++,使用适当的类型(auto,std::size\t,std::vector::size\u type)并从vector.size()向下迭代到0(而不是从vector.size()-1向下迭代到-1): for(std::size\u t i=vector.size();i>0;--i) { if(i
auto
,std::size\t
,std::vector::size\u type
)并从vector.size()
向下迭代到0
(而不是从vector.size()-1
向下迭代到-1
):
for(std::size\u t i=vector.size();i>0;--i)
{
if(i
您可以选择以下几种方式:
如果使用向量,请使用迭代器进行遍历:
for (auto it = vector.rbegin(); it != vector.rend(); ++it)
或者使用不同的for语句:
for (size_t i = vector.size(); i-- > 0; )
我还看到了(size\u t I=myArray.size()-1;I!=(size\u t)-1;I--)的(cf.)或者:
for(size_t j = 0; j < vector.size(); j++){
size_t i = vector.size() - 1 - j;
...
}
for(size_t j=0;j首先,学习一些已经熟知的成语,它允许你使用<代码>未签名< /Cord>类型编写递减循环。这是C和C++中绝对重要的技能。例如
for ([some unsigned type] i = N; i-- > 0; )
{
// Process i-th element
}
或
(注意,i
的初始值是N
,而不是N-1
)
或者你甚至可以使用“更自然”的方法
其次,开始使用正确的无符号类型进行向量索引
for (auto i = vector.size() - 1; i != -1; --i)
或
这将解决您的警告问题
或者,您可以选择“失败者的出路”,并通过使用显式强制转换来抑制警告
if ((unsigned) i < vector.size() / 2)
if((无符号)i
或者只需执行#pragma warning(disable:4018)
Me,我将为适配器编写一个索引范围
和向后写入,这会调整范围以反向迭代
这给了我们:
for(auto i:backwards(indexes_into(container))){
其结果是不易出错、效率高,并且在使用时意图更清晰(只要您信任您的实用程序代码)
boost、rangesv3和我的各种SO帖子中都有解决方案。这段代码没有问题。您对其效果的理解是正确的。警告只是一些编译器编写者关于良好风格的概念,当您比编译器编写者更了解您的代码时,您可以忽略它。@EMO:尝试使用vector.crbegin()
用于反向迭代向量。如果您想要高WTF/分钟,可以对(unsigned int i=vector.size()-1;i可能的复制品是MRTUX,是的,在我发布之前我没有找到问题,但是很不幸,海报选择了C++和C,因为答案不同。C在.NET中不存在这个问题,因为在.NET中代码>数组。长度< /COD>,<代码>列表。整数-这可能是为了避免这种问题。这样做会跳过向量[0]@Dadam,不,谁说你会使用vector[i]
而不是vector[i-1]
?…经验。除非在块的开头引用该项,否则至少会忘记减量一次time@Dadam,嗯,你在做毫无根据的假设(因为你不知道我是否有经验),这是在OP的问题中甚至没有提到索引的时候……对不起,没有冒犯的意思:根据我的经验,每个人都会犯这样的小错误
for (auto i = vector.size() - 1; i != -1; --i)
for ([your vector type]::size_type i = vector.size() - 1; i != -1; --i)
if ((unsigned) i < vector.size() / 2)
for(auto i:backwards(indexes_into(container))){