Intereting Posts
Невозможно понять различные результаты экспериментов с размерами буфера в C и C ++. Также ifstream медленнее, чем FILE? char **, чтобы справиться со строкой? Как определить оптимальный размер блока ввода-вывода диска на Win32? Как разбить строку на C без использования strtok Указатели файлов ведут себя по-разному при передаче функций. Зачем? Поле точности в printf при форматировании целого числа Как настроить GDB в Eclipse таким образом, чтобы все prcoesses продолжали работать, включая отлаживаемый процесс? Подсчитайте количество вхождений 0 в целых числах от 1 до N C-код для игнорирования клавиши ввода после ввода Как получить вывод grep в C Насколько переносимым является код с оптимизацией #pragma? Создание правильных файлов .DEF для экспорта нестатических функций и GLOBALS Как я могу генерировать разные случайные числа для каждого игрока? Как сохранить порядок элементов с одним и тем же приоритетом в очереди приоритетов, реализованной как двоичная куча? Что здесь происходит в этом цикле

операции pre и post increment на переменной дают разные результаты на TC и gcc

Вот мой простой код …

#include int main() { int i=5; printf("%d %d %d %d %d ",i++,i--,++i,--i,i); return 0; } 

В gcc он дает результат как «4 5 5 5 5»

но на TC, он дает результат как «4 5 5 4 5»

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

но если printf содержит несколько выражений, тогда оценка будет на стеке, элементы будут помещены в стек слева направо, но выскочили справа налево и оправдали вывод TC

Пожалуйста, поправьте меня, где я ошибаюсь ???

C не указывает, какие аргументы функции порядка следует оценивать, и поэтому он не определен, и компилятор может это сделать, но они выбирают, включая произвольно и случайным образом. Бьярне Страуструп говорит об этом явно в разделе «Язык программирования C ++», раздел 6.2.2

Он также дает повод:

 Better code can be generated in the absence of restrictions on expression evaluation order 

Я думаю, что порядок, в котором вычисляются аргументы вызова функции, не указан. Как википедия говорит в этой статье о точках последовательности:

Порядок, в котором оцениваются аргументы, не указан

Изменение объекта (в этом коде i ) более одного раза между предыдущей и следующей точками последовательности является неопределенным поведением в C. Здесь точка последовательности возникает при вызове функции после того, как все аргументы были оценены.

Два ответа на этот момент времени ссылаются на неопределенность оценки аргументов функции. Правильный ответ заключается в том, что ваша программа не определена из-за побочных эффектов для одной и той же переменной, не разделенной точкой последовательности .

Действительно, порядок оценки аргументов функции не указан . Это означает, что в утверждении f(g(), h()); , либо g() вызывается до h() либо вызывается после.

Тем не менее, побочные эффекты (как в вашей программе) не вызвали неопределенного поведения, когда что-то может произойти.

Накапливая старую тему, но я только что нашел, как компилятор gcc и Visual Studio работает над несколькими изменениями в одной и той же переменной в заявлении, поэтому подумал о его совместном использовании.

Компилятор, как определено здесь, начинает реализовывать метод стека по аргументам, переданным в printf, который является «i». Он следует этим правилам:

1) Теперь он выполняет предварительные приращения, поэтому, начиная с правого нормального i, тогда – i, а затем выполняется ++ i, а значение i после ++ i равно 5, поэтому он реализует эти значения (pops), поэтому вывод равен _ _ 5 5 5

2) Затем он продолжается справа налево и выполняет посты, поэтому i-, а затем i ++, поэтому значение i в конце возвращается к 5, но из-за i – оно становится 4, но показывает 5 из-за того, что это сообщение при этом конечный результат равен 4 5 5 5 5, а конечное значение i равно 5

Надеюсь, я смогу устранить ваши сомнения.

ТС не следует этому, поэтому придерживается нашей человеческой логики.