Clang компилирует (clang -O3 -masm=intel
) программу
int main(int c, char **v) { unsigned int j; return c < 2 ? j * 2 : 1234; }
в следующее:
xor ecx, ecx
cmp edi, 2
mov eax, 1234
cmovl eax, ecx
ret
, тогда как компилирует программа
int main(int c, char **v) { unsigned short j; return c < 2 ? j + j : 1234; }
для следующего:
xor ecx, ecx
cmp edi, 2
mov eax, 1234
cmovl eax, ecx
ret
Также компилирует программу
int main(int c, char **v) { unsigned int j; return c < 2 ? j + j : 1234; }
для следующего:
mov eax, 1234
ret
Мой вопрос: почему все они обрабатываются по-разному?
Если они неопределяемого поведения, почему компилятор не заставляет их всех просто возвращать 1234
?
И в любом случае, почему к j + j
и j * 2
относятся по-разному? Они как-то семантически отличаются?