VS .NET Compiler
i : 2 1 1
j : 2 1 1
то есть то что и должно быть
Результат дизассемблирования в студию!
j : 3 1 1
gcc 3.2
i : 3 1 3
j : 3 1 3
А вам никто и никогда не советовал не использовать ++ в printf, потому что это неспецифированная функция? То есть для нее не гарантируется порядок обработки параметров...
1111! Чуть не пропустил
i : 1 1 3
j : 1 1 3
Ну то что в разных компиляторах по разному ето фиг с ним просто по разному выражения разбирают. Странно что у госта разные для i и j ответы получились
++posts чуть не пропустил...
MS - suxx
Маза не существует в данном случае единственно правильного результата. Перцу, который пишет подобное в реальной программе, нужно руки обрывать.
естественно писать так не стоит, но за GCC можно порадоваться.
В первый раз слышу о том, что для таких выражений есть предсказуемое поведение.
Не странно. &i видел? Почти уверен, что j соптимизировано в регистр, а i используется из памяти.
pushl $1
pushl $1
pushl $3
pushl $.LC0
call printf
pushl $1
pushl $1
pushl $3
pushl $.LC1
call printf
Обходится и без регистров, и без памяти.
Но я-то отвечал на то, почему у i и j разные результаты получаются
Потому что не делаются соостветствующие выводы из того, что pi после инициализации не используется. А вот почему - то ли ума не хватает, то ли так и задумано - это надо обращаться к разработчику
Ну насколько я помню это, например, используется даже в том же gcc. В качестве предотвращения порчи значений переменных при том же vfork info gcc рекомендует либо volatile, либо (для совместимости со старыми компиляторами) (void)&i; - взятие адреса. Чтобы избежать оптимизации в регистр.
Стандарт говорит, что так делать нельзя, а если все-таки сделать, то результат - неопределен (undefined behaviour). и компилятор может делать все что угодно, хотя винт форматировать.
Оставить комментарий
tosha01
Кто может объяснить разницу ?#include <stdio.h>
int main(void)
{
int i=0 ,j=0;
int *pi=&i;
printf (" i : %d %d %d \n", ++i, i++, ++i);
printf (" j : %d %d %d \n", ++j, j++, ++j);
return 0;
}
результат работы
(релиз, дебаг - одна фигня)
i : 3 1 3
j : 2 1 2