Увеличение относительно TCC, GCC

Я пропускаю заголовочные файлы и освобождаю основной...
Код 1:-

int a = 5 , c ;
c = a++ + ++a + a++;
a = 5;
printf("%d %d",a++ + ++a + a++ , c);
___________________________________________________

Выводы:-
TCC:- (Да Borlands 3.0 или как там он называется один для DOS-синей среды)
19 18
19 = как ? 5+7+7, и если да (определенно по сравнению с выходом GCC), то почему не 18?

18 = 6+6+6 ? (код присваивания c эквивалентен
a++;
c=a+a+a;
a++;
a++;) правильно ?
и почему 19 18 ? два разных значения для одного и того же кода?
GCC:-
19 19
19 оба 5+7+7 ? имеет смысл..

Теперь код 2:-

int a = 5 , c ;
c = ++a + ++a + ++a;
a = 5;
printf("%d %d",++a + ++a + ++a, c);
_________________________________________________

TCC:-
24 24
24 с той же логикой 8+8+8(c код присваивания, эквивалентный
a++;
a++;
a++;
c=a+a+ а;
) и а = 8 ;

GCC:-
22 22
22 ? как ? по обычной логике 6 + 7 + 8 = 21 но на выходе 22 ?
тогда 6+8+8 и если да то как ?


person Ninad Sheth    schedule 01.05.2015    source источник
comment
stackoverflow .com/questions/6067722/ Это может иметь значение. Это (или, по крайней мере, кажется) связано с неопределенным порядком выполнения операций.   -  person Luke    schedule 01.05.2015
comment
meta.stackexchange.com/questions/22232/   -  person Levi    schedule 01.05.2015
comment
@ Люк, это немного важно, но я не меняю значение «а» между двумя аргументами вызова функции «printf()», «с» вычисляется отдельно, а затем «а» сбрасывается до 5.   -  person Ninad Sheth    schedule 01.05.2015


Ответы (1)


Различные компиляторы выполняют выражение по-своему. Компиляторы выполняют операторы с оптимизацией. В идеале мы не должны сравнивать поведение версий компилятора, т. е. TCC, GCC, Borland c и т. д.

Порядок выполнения может меняться от компилятора к компилятору в зависимости от методов оптимизации.

Справочный ответ: Очень хорошее объяснение

С точки зрения экзамена, мы должны следовать стандарту учебника в этом типе вопросов.

person Kushal    schedule 01.05.2015
comment
поэтому возможно, что оптимизация для 'c = a++ + ++a + a++;' отличается от оптимизации «a++ + ++a + a++» в вызове функции по отношению к TCC (хотя расчет точно такой же), и, следовательно, два ответа, а именно. 18 19 генерируются ? - person Ninad Sheth; 01.05.2015
comment
да .. потому что во время выполнения оператора second компилятор мог принять другой порядок, учитывая методы оптимизации - person Kushal; 01.05.2015
comment
Код, который имеет OP, демонстрирует неопределенное поведение. - person Spikatrix; 01.05.2015