Как поступит умная система?
Проверит первое условие и пойдет по нужным веткам если true.
А это делать нельзя...
Тут в общем-то даже не в "умности" системы дело. Например, стандарт C99 явно определяет "замыкание" логических операций:
6.5.13 Logical AND operator
4. Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.
Т.е. такая "оптимизация" даже не зависит от доброй воли автора компилятора, а явно навязывается стандартом. Если выполнить вычисление второй части логического выражения, компилятор уже не будет соответствовать стандарту. Во многих других языках примерно то же самое.
Конечно, в C всегда есть лазейка в виде битовой операции &, которая в данном случае даст то же самое, но гарантированно вычислит оба операнда. Но тут уже от языка зависит.
А вообще, как я понял, загвоздка здесь в том, что функция b=f(x) имеет побочные эффекты, и именно поэтому ее необходимо было выполнить 2 раза. Вообще с такими функциями нужно поосторожнее, ибо чревато. Лучше по возможности разделять"чистые" функции без побочных эффектов и процедуры, которые явно меняют среду. Тогда и оптимизировать проще (например, как в нашем случае, когда можно воспользоваться результатом предыдущего вызова и не вычислять функцию повторно при том же аргументе).