

Even though this isn’t C, but if we take from the C11 draft §6.8.5 point 6 (https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):
An iteration statement whose controlling expression is not a constant expression, that performs no input/output operations, does not access volatile objects, and performs no synchronization or atomic operations in its body, controlling expression, or (in the case of a for statement) its expression-3, may be assumed by the implementation to terminate
“new Random().nextInt()” might perform I/O though so it could still be defined behavior. Or the compiler does not assume this assumption.
But an aggressive compiler could realize the loop would not terminate if x does not become 10 so x must be 10 because the loop can be assumed to terminate.











It’s calling a function without a parameter.
You know how in math you had something like:
f(x) = x²
Not all functions need parameters though. The function:
f(x) = 2
does not even use the provided x! So just leave it out:
f() = 2
Similarly, you could give a function two parameters:
f(x, y) = x + y
Programmers use functions to primarily organize their code. Otherwise it would get very unreadable very quickly. Those function are usually a bit more complicated than a single line, though.
dog.walk() would call the walk() function of “dog”. Some valid code could be:
dog.walk() wait(10) dog.stop()This code would make the dog walk for 10 seconds assuming every function used is actually defined somewhere.