For C this is well-defined: number_a == 1
is evaluated first, and number_b == 2
is evaluated only if the first condition was true (this is called short-circuiting and is important if one of the conditions has a side effect of evaluation).
Cppreference.com confirms this with a more formal restatement:
The logical AND expression has the form lhs && rhs
...
There is a sequence point after the evaluation of lhs. If the result of lhs compares equal to zero, then rhs is not evaluated at all (so-called short-circuit evaluation)
That said, you should not worry about optimization at this level and trust your compiler instead. The difference between these two computations is microscopic and might even be the opposite of what you expect due to microarchitectural effects such as pipelining and other low-level bits.
Instead, focus on writing code that is clean, concise, and readable, while writing algorithms that are efficient in their design. Microoptimization can then be performed if it is absolutely necessary, as a later step.