Первый фактически зависит от компилятора, потому что он разрешается в (i++ * i++)
.Компилятор может упорядочить эти операции для собственных нужд, потому что выражение не имеет «точек последовательности».
В Википедии есть хорошая статья о точках последовательности .
* 1007.* Первый пример - это действительно то, что происходит в викторинах, и правильный ответ - «результат неопределенный».
Второй - просто неверный;вам повезло, что это не дало вам ошибку сегментации или тому подобное.Обратите внимание на printf
: он пытается извлечь два значения из стека, которые не были переданы.Значение, которое вы видите напечатанным, - это то, что происходит в стеке, и если после вас будет вызван другой вызов функции, в этот момент он, скорее всего, потерпит неудачу.