【发布时间】:2018-01-29 14:21:16
【问题描述】:
我有以下 C++ 代码:
return lineNum >= startLineNum
&& lineNum <= startLineNum + lines.size() - 1;
这里,lineNum 是 int,startLineNum 是 int,lines 是 std::vector<std::string>,lines.size() 是 size_t 类型。
当lineNum 为2,startLineNum 为0,lines.size() 为0 时,代码返回true,即使false 是预期的。这些值就是调试器中显示的值。
即使在可能的情况下添加括号:
return ((lineNum >= startLineNum)
&& (lineNum <= (startLineNum + lines.size() - 1)));
代码仍然错误地返回true。
当我将代码重构为这种形式时:
int start = startLineNum;
int end = startLineNum + lines.size() - 1;
return lineNum >= start && lineNum <= end;
它现在按预期返回false。
这里发生了什么?我从来没有遇到过这种奇怪的事情。
【问题讨论】:
-
你如何分辨这些值?您是在查看调试器中显示的值,还是事先将它们打印出来?
-
变量有哪些类型?请创建一个Minimal, Complete, and Verifiable Example 向我们展示。
-
也许你对无符号算术有疑问。 lines.size() 是 size_t 类型,startLineNum 是什么类型?
-
@marcinj 干得好!这就是问题所在。
-
@KillzoneKid:不。只有有符号类型有溢出 UB。无符号类型必须换行。
标签: c++ visual-c++ return