我应该怎么做C++代码中的"签名/无符号不匹配"警告,如下所示:
for (int i = vector.size() - 1; i >= 0; --i) // OK
{
if (i < vector.size() / 2) // warning C4018: '<': signed/unsigned mismatch
// ...
}
Run Code Online (Sandbox Code Playgroud)
(一个人为的例子,但它证明了这个问题.)
如何处理"签名/未签名的不匹配"警告(C4018)?说要size_t用于循环变量,但是这对于终止于0的递减循环不起作用.它在没有警告的情况下编译,但是整数在运行时溢出(或者它是下溢?)并且变为4294967295.
首先,学习一些成熟的习语,它们允许你使用unsigned类型来编写递减周期.这是C和C++中绝对必要的技能.例如
for ([some unsigned type] i = N; i-- > 0; )
{
// Process i-th element
}
Run Code Online (Sandbox Code Playgroud)
要么
for ([some unsigned type] i = N; i > 0; )
{
--i;
// Process i-th element
}
Run Code Online (Sandbox Code Playgroud)
(注意,初始值i是N,不是N - 1.)
或者你甚至可以使用"更自然"的方法
for ([some unsigned type] i = N - 1; i != -1; --i)
{
// Process i-th element
}
Run Code Online (Sandbox Code Playgroud)
其次,开始使用适当的无符号类型进行向量索引.在你的情况下
for (auto i = vector.size() - 1; i != -1; --i)
Run Code Online (Sandbox Code Playgroud)
要么
for ([your vector type]::size_type i = vector.size() - 1; i != -1; --i)
Run Code Online (Sandbox Code Playgroud)
这将解决您的警告问题.
或者,您可以选择"失败者的出路",并通过使用显式强制转换来抑制警告
if ((unsigned) i < vector.size() / 2)
Run Code Online (Sandbox Code Playgroud)
或者只是做#pragma warning(disable: 4018).
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |