C ++ return statement doesn't behave as expected

I have the following C ++ code:

return lineNum >= startLineNum
&& lineNum <= startLineNum + lines.size() - 1;

Here lineNumis int, startLineNumis int, linesis std::vector<std::string>, and lines.size()has a type size_t.

When lineNumequal to 2, startLineNumequal to 0, and lines.size()equal to 0, the code returns true, although it was expected false. These values ​​were the values ​​displayed in the debugger.

Even after adding parentheses where possible:

return ((lineNum >= startLineNum)
&& (lineNum <= (startLineNum + lines.size() - 1)));

the code still returns incorrectly true.

When I reorganize the code into this form:

int start = startLineNum;
int end = startLineNum + lines.size() - 1;
return lineNum >= start && lineNum <= end;

now returns falseas expected.

What's going on here? I have never encountered this oddity before.

+4
source share
2

lines.size() . ( lines std::vector, , , unsigned.)

, - ,

startLineNum + lines.size() - 1;

, unsigned.

, 0 + 0 - 1 std::numeric_limits<decltype(lines.size())>::max() - , lineNum, , .

: , , .

lineNum < startLineNum + lines.size()
+11

,

lineNum <= startLineNum + lines.size() - 1;

- . linenum 2, 0, 0-1 - - ( 4 4 ).

lineNum + 1 <= startLineNum + lines.size();

.

+1

Source: https://habr.com/ru/post/1692878/


All Articles