Я читаю книгу о языке программирования C. Название книги — «Программирование на C и C++», автор — Девендра Нага.
Я не понял объяснения фрагмента кода.
Почему этот код выводит неопределенное поведение? Я знаю, что компилятор игнорирует пробельные символы. Не могли бы вы рассказать мне об объяснении поведения этого кода? Автор книги говорит, что вывод этого кода не определен, но я в этом не уверен. Возможно, это связано с точкой последовательности. Но я не уверен.
Я думаю, что этот код не содержит какой-либо неопределенной ситуации поведения.
Вам следует учиться по хорошей книге. См.: Полное руководство и список книг по C (или для C++, поскольку вы упомянули, что ваша текущая книга пытается научить обоим: Полное руководство и список книг по C++).
Я нашел книгу на github. ИНХО, он не стоит запрашиваемой цены.
Похоже, Девендра Нага пытается донести до вас, что порядок оценки параметров, передаваемых в функцию, не определен (если я вообще могу это понять), но автор запутал суть, используя вариативное числовое выражение printf() как пример. В списке параметров имеется только одна оценка i. Я поддержу предложение выбрать из списков книгу получше.
Еще следует отметить, что «язык оставляет поведение на усмотрение компилятора». Хотя технически да, если вы вызываете неопределенное поведение, компилятор может практически делать все, что захочет, но это также размывает поведение, определенное реализацией, и неопределенное поведение, которые сильно различаются (хотя ни одно из них не присутствует в этом коде).
УБ здесь нет. Но оно легко может появиться. Статья про printf и ub: pvs-studio.com/en/blog/posts/cpp/0722





В разделе 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.
Кодекс легален, а книга — мусор.