Язык программирования C Неопределенное поведение

Я читаю книгу о языке программирования C. Название книги — «Программирование на C и C++», автор — Девендра Нага.

Я не понял объяснения фрагмента кода.

Почему этот код выводит неопределенное поведение? Я знаю, что компилятор игнорирует пробельные символы. Не могли бы вы рассказать мне об объяснении поведения этого кода? Автор книги говорит, что вывод этого кода не определен, но я в этом не уверен. Возможно, это связано с точкой последовательности. Но я не уверен.

Я думаю, что этот код не содержит какой-либо неопределенной ситуации поведения.

Кодекс легален, а книга — мусор.

HolyBlackCat 17.07.2024 08:55

Я нашел книгу на github. ИНХО, он не стоит запрашиваемой цены.

n. m. could be an AI 17.07.2024 09:32

Похоже, Девендра Нага пытается донести до вас, что порядок оценки параметров, передаваемых в функцию, не определен (если я вообще могу это понять), но автор запутал суть, используя вариативное числовое выражение printf() как пример. В списке параметров имеется только одна оценка i. Я поддержу предложение выбрать из списков книгу получше.

David C. Rankin 17.07.2024 09:32

Еще следует отметить, что «язык оставляет поведение на усмотрение компилятора». Хотя технически да, если вы вызываете неопределенное поведение, компилятор может практически делать все, что захочет, но это также размывает поведение, определенное реализацией, и неопределенное поведение, которые сильно различаются (хотя ни одно из них не присутствует в этом коде).

Thomas Jager 17.07.2024 12:58

УБ здесь нет. Но оно легко может появиться. Статья про printf и ub: pvs-studio.com/en/blog/posts/cpp/0722

AndreyKarpov 20.07.2024 09:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В разделе 6.5.2.4, параграф 2 «последнего свободно доступного проекта стандарта C17»,

Результатом операции postfix++ является значение операнда. В качестве побочного эффекта стоимость Объект операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа).

Вычисление значения результата упорядочивается до побочного эффекта обновления сохраненного значения операнда.

Таким образом, поведение postfix++ кажется четко определенным.

Возможно, автор пытался объяснить возможное неопределенное поведение при множественных неупорядоченных побочных эффектах для одного скалярного значения, но потерпел ужасную неудачу.

По пункту 2 раздела 6.5,

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

получение результата таких вещей, как printf("%d %d\n", i++, i++); undefined.

Don't blame me about using draft instead of published standard. You need to pay 216 Swiss Francs to get one PDF copy of it.

Другие вопросы по теме

Хорошо ли определено приведение к идентичному макету с константными членами?
Приводит ли наличие вектора, содержащего структуры с неинициализированными членами, к неопределенному поведению?
Является ли вставка в вектор при одновременном доступе к вектору неопределенным поведением?
Является ли UB чтение байтов из malloc() без предварительной их инициализации?
Разный вывод в GCC и Visual Studio
Почему вызов оператора* для пустого std::optional вызывает неопределенное поведение, если я не сразу получаю доступ к возвращаемому значению?
Строгое псевдонимирование первого члена структуры через непрозрачный указатель в C
Оставлен ли логический сдвиг из-за неопределенного поведения размера слова в C#?
Является ли неопределенным поведение передача указателя на несконструированный объектstreambuf в конструктор ostream?
Является ли «static int* foo()» в C статической функцией, возвращающей указатель, или функцией, возвращающей статический указатель?