If you compile and run the program with assertions turned on you'll see that a is not correct, since no AssertionError ever gets thrown. The reason that it never gets thrown is that each time the program execution begins an iteration through the for loop, it must first be true that i < j. Then the first statement in the for loop checks the truth value of the statement i < j-- which will always yield the same result as the previous test i < j because the postfix decrement operator causes j-- to be evaluated to the original value of j before the value of j is changed to a lower number.
For example, the first time through the loop, i = 0 and j = 5. i < j evaluates to 0 < 5 which evaluates to true. i < j-- evaluates to 0 < 5 which evaluates to true, after which the value of j becomes 4. After a couple more iterations, i = 2 and j = 3, so i < j evaluates to 2 < 3 which evaluates to true, so we enter the loop again. i < j-- evaluates to 2 < 3 which evaluates to true, and then the value of j becomes 2. On the next iteration, i = 3 and j = 2, so i < j evaluates to 3 < 2 which evaluates to false, so the body of the loop does not execute. We exit the loop and the program terminates.
hey .. as joseph explained if u trace through the loop values u will fine if assertion is enabled .. j is decremented and i is incremented so 4 is last values printed.. But if assertion is disabled then assert statement is not executed .. meaning j is not decremented and hence last value is 20