Оптимизация допустима из-за «как если бы правила» , то есть C11 5.1.2.3p6 .
Соответствующая реализация просто необходима для создания программы, которая при запуске выдает такое же наблюдаемое поведение , что и при выполнении программы с использованием абстрактной семантики получилось бы .Остальная часть стандарта просто описывает эти абстрактную семантику .
То, что внутренне скомпилированная программа не имеет значения, единственное, что имеет значение, это то, что когда программа заканчивается, она не имеетлюбое другое наблюдаемое поведение, за исключением чтения a
и b
и печати значения a + 1
или b + 2
в зависимости от того, какое из них a
или b
больше, если не происходит что-то, что вызывает поведение, не определенное,(Неправильный ввод приводит к тому, что a, b неинициализируются и, следовательно, доступы не определены; возможны ошибки диапазона и переполнение со знаком.) Если происходит неопределенное поведение, все ставки отключены.
Поскольку доступ к изменчивым переменным долженоцениваясь строго в соответствии с абстрактной семантикой, вы можете избавиться от условного перемещения, используя volatile
здесь:
#include <stdio.h>
int main() {
volatile int a, b;
scanf("%d %d", &a, &b);
int c = a > b ? a + 1 : 2 + b;
printf("%d", c);
return 0;
}
компилируется в
call __isoc99_scanf@PLT
movl (%rsp), %edx
movl 4(%rsp), %eax
cmpl %eax, %edx
jg .L7
movl 4(%rsp), %edx
addl $2, %edx
.L3:
leaq .LC1(%rip), %rsi
xorl %eax, %eax
movl $1, %edi
call __printf_chk@PLT
[...]
.L7:
.cfi_restore_state
movl (%rsp), %edx
addl $1, %edx
jmp .L3
моим GCC Ubuntu 7.2.0-8ubuntu3.2