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 - 1是std::numeric_limits<decltype(lines.size())>::max()-大量的确,和lineNum比它最有可能更少.
经验法则:在使用无符号类型时永远不要使用否定,除非你真的知道你在做什么.
在您的情况下,重述问题
lineNum < startLineNum + lines.size()
Run Code Online (Sandbox Code Playgroud)