C++ return语句的行为不符合预期

use*_*152 4 c++ return visual-c++

我有以下C++代码:

return lineNum >= startLineNum
&& lineNum <= startLineNum + lines.size() - 1;
Run Code Online (Sandbox Code Playgroud)

这里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)));
Run Code Online (Sandbox Code Playgroud)

代码仍然错误地返回true.

当我将代码重构为这种形式时:

int start = startLineNum;
int end = startLineNum + lines.size() - 1;
return lineNum >= start && lineNum <= end;
Run Code Online (Sandbox Code Playgroud)

它现在false按预期返回.

这里发生了什么?我以前从未遇到过这种陌生感.

Bat*_*eba 11

lines.size()很可能是无符号类型.(例如,如果lines肯定的话.)std::vector unsigned

因此,由于论证推广的规则,以及在中的条款的事实

startLineNum + lines.size() - 1;
Run Code Online (Sandbox Code Playgroud)

分组从左至右,它们都转换为unsigned类型.

这意味着0 + 0 - 1std::numeric_limits<decltype(lines.size())>::max()-大量的确,和lineNum比它最有可能更少.

经验法则:在使用无符号类型时永远不要使用否定,除非你真的知道你在做什么.

在您的情况下,重述问题

lineNum < startLineNum + lines.size()
Run Code Online (Sandbox Code Playgroud)