Выход будет всегда (для 99,98% наиболее важных совместимых со стандартами компиляторов и систем) 2.
В соответствии со стандартом это выглядит так: по определению , "неопределенное поведение ", самооправдание определения / ответа, которое ничего не говорит о том, что на самом деле может произойти, и особенно почему .
утилита шина (котораяне является инструментом проверки соответствия стандарту std), и поэтому программисты splint считают это «неопределенным поведением».В основном это означает, что оценка (x+1)
может дать 1 + 1 или 2 + 1, в зависимости от того, когда обновление x
действительно выполнено.Поскольку, однако, выражение отбрасывается (формат printf читает 1 аргумент), результат не изменяется, и мы все еще можем сказать, что он равен 2.
undefined.c: 7: 20: Аргумент 2 изменяет x,используется аргументом 3 (порядок вычисления фактических параметров не определен): printf ("% d \ n", ++ x, x + 1) Код имеет неопределенное поведение.Порядок вычисления параметров функции или подвыражений не определен, поэтому, если значение используется и изменяется в разных местах, не разделенных порядком оценки, ограничивающим точку последовательности, то результат выражения не определен.
Как уже говорилось, неуказанное поведение влияет только на оценку (x+1)
, а не на весь оператор или другие его выражения.Таким образом, в случае «неопределенного поведения» мы можем сказать, что вывод равен 2, и никто не может возражать.
Но это не неопределенное поведение, это, кажется, «неопределенное поведение».И «неопределенное поведение», похоже, должно быть чем-то, что влияет на весь оператор, а не на одно выражение.Это связано с загадкой, вокруг которой фактически происходит «неопределенное поведение» (то есть, что именно влияет).
Если будут мотивации для присоединения «неопределенного поведения» только к (x+1)
выражение, как в случае «неопределенного поведения», тогда мы все еще можем сказать, что вывод всегда (100%) 2. Присоединение «неопределенного поведения» только к (x+1)
означает, что мы не можем сказать, если оно1 + 1 или 2 + 1;это просто " что-нибудь ".Но опять же, это «что-нибудь» отбрасывается из-за printf, и это означает, что ответ будет «всегда (100%) 2».
Вместо этого из-за таинственной асимметрии «неопределенное поведение» может присоединено только к x+1
, но на самом деле должно повлиять как минимум на ++x
(что, кстати, является причиной неопределенного поведения), если нетвсе утверждение.Если он заражает только выражение ++x
, выводом является «неопределенное значение», т. Е. Любое целое число, например -5847834 или 9032. Если оно заражает весь оператор, то вы можете увидеть gargabe в выводе консоли, вероятно, вы могли бы иметьчтобы остановить программу с помощью ctrl-c, возможно, до того, как она начнет душить ваш процессор.
Согласно городской легенде, «неопределенное поведение» поражает не только всю программу, но также ваш компьютер и законыфизику, чтобы таинственные существа могли быть созданы вашей программой и улетели или съели вас.
Нет ответов, что-то компетентно объясняет по этой теме.Они просто «о, видите, стандарт говорит об этом» (и это просто интерпретация, как обычно!).Итак, по крайней мере, вы узнали, что «существуют стандарты», и они ставят и образовательные вопросы (поскольку, конечно, не забывайте, что ваш код неправильный , независимо от неопределенного / неуказанного поведения и других стандартных фактов)Бесполезные логические аргументы и бесцельные глубокие исследования и понимание.