Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “;有符号/无符号不匹配”;循环递减的警告(C4018) =0;--i)//确定 { 如果(i0;--i) { if(i_C++_Visual C++ - Fatal编程技术网

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))){