>>> if(-10 * abs(i - 1) == 10 * abs(i - 1)){
>
>вот например: printf("%d %d %d\n", i++, i++, i++) - тут неорпределенность о
>которой вы говорили. а вышеприведенном выражении умножение константы на вызов ф-и,
>какая же тут неопределенность.
>
>З.Ы. причем результат не зависит ни от значения i ни от замены
>10и на любое другое число. Самое интересное вот что получается при компиляции
gcc -Wall -O -c inet.c
//inet.c
int main(void)
{
int i=2;
int i0,i1;
if( ((-10) * (abs(i - 1))) == (10 * (abs(i - 1)))){
printf("OMG,-10==10 in linux!\n");
}
else {
printf("nothing special here\n");
}
return 0;
}
// init.s
.file "inet.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "OMG,-10==10 in linux!"
.text
.globl main
.type main, @function
main:
pushl Кp
movl %esp, Кp
subl $8, %esp
andl $-16, %esp
subl $28, %esp
pushl $.LC0
call puts
addl $16, %esp
movl $0, Йx
leave
ret
.size main, .-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)"
здесь видно что даже строки которая отвечает за вывод альтернативы нет.
Значит при проходи компилятора он решил что она не нужна!!
Значит уже на этапе компиляции принято решение что -10==10.
А вот что получается когда компилируеш с такими же опциями
// inet.c
int main(void)
{
int i=2;
int i0,i1;
i0 = abs(i - 1);
i0 = -10 * i0;
i1 = abs(i - 1);
i1 = 10 * i1;
if(i0 == i1){
printf("OMG,-10==10 in linux!\n");
}
else {
printf("nothing special here\n");
}
return 0;
}
//inet.s
.file "inet.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC1:
.string "nothing special here"
.text
.globl main
.type main, @function
main:
pushl Кp
movl %esp, Кp
subl $8, %esp
andl $-16, %esp
subl $28, %esp
pushl $.LC1
call puts
addl $16, %esp
movl $0, Йx
leave
ret
.size main, .-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)"
И опять решение о сравнении находится на этапе компиляции.
Видно что сам компилятор игнорирует функцию abs. Только сейчас обратил внимание.
Может у кого-то еще будут предложения. Пока у меня ответа нет.