Во-первых, это не глупый вопрос:)
Чтобы понять, почему вы не можете сделать это с помощью какого-то специального трюка, нам нужно перейти к сборке, которая генерируется оператором if (в частности, сборка для процессора Intel с gcc 4.2.1 - другая) архитектура приведет к разной сборке).
Возьмите эту простую программу на C:
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
if (i == 8)
{
return 100;
}
else
{
return 3;
}
}
Если пользователь вводит ненулевое целое число, мы возвращаем 100; в противном случае мы возвращаем 3. Фактическое условие здесь не имеет значения, потому что нас интересует только сборка, сгенерированная для main
:
; ...
call _scanf
movl -4(%rbp), %eax
cmpl $8, %eax
jne L2
movl $100, -20(%rbp)
jmp L4
L2:
movl $3, -20(%rbp)
L4:
movl -20(%rbp), %eax
leave
ret
Я собираюсь предположить, что у вас нет знаний о сборке - но не волнуйтесь, с этим примером не так уж сложно справиться. Здесь происходит то, что мы call scanf
, и мы compare
результат этого (i
) с 8.
Далее, J
UMP, если N
OT E
квалифицированная инструкция для метки L2. Это означает, что если i
равно 8, выполняются следующие инструкции:
- Переместить 3 в
rbp
- Переместить
rbp
в eax
- Выйти (тем самым возвращая значение 3 из программы).
Однако, если i
равно , а не равно 8, тогда, когда мы нажимаем на инструкцию jne
, мы не прыгаем. Вместо этого мы:
- Переместить 100 в
rbp
J
u mp
безоговорочно на этикетку L4
- Переместите
rbp
в eax
и в итоге получите 100 из программы.
С созданной здесь сборкой, на самом деле есть только две возможные ветви. Вы не можете произвольно изменить порядок кода.
Так возможно ли выполнить обе ветви (когда они не являются return
операторами)? Да, при условии, что ваш компилятор не способен правильно генерировать код ветвления. Но этого никогда не произойдет на компиляторе уровня производства.