It is possible for a if statement to be false. Do you think that if statements always must be true? Doesn't work like that.
In the worst possible case, where v[i] is always less than v[left], the routine will march along always swapping nothing. As a side effect of the (no-op) swap last is incremented. We need that side effect so the swap is performed regardless of whether it's really swapping.
But suppose that the worst possible case does not arise. If the routine should ever encounter even a single case where v[i] is not less than v[left], last and i would move out of sync. This would last for the rest of the loop, once out of sync, they could never sync up again.
If this bums you out too much, put a test in the swap routine to inhibit the swap if you are not really swapping. But now you are performing a test for every swap. The superfluous test will slow you down if it rarely inhibits a swap. But if it winds up inhibiting most of them, it might be worth it. It's your call...how pessimistic are you?