Эта программа демонстрирует unspecified behavior поскольку порядок оценки суб выражение не определенно исключением случаев, когда это специально определенно:
printf("%d",printf("hi!")*printf("bye"));
^ ^
1 2
Так что либо 1 или 2 может быть оценен первым, и вы не можете определить, какие. Мы можем увидеть это из раздела C99 draft standard6.5
Выражения пункт который говорит (курсив мой идти вперед):
Группировка операторов и операндов обозначается syntax.74) За исключением случаев, указанных позже (для функции-call(), & &, ||,?: И операторы запятой), порядок оценки подвыражений и порядок, в котором происходят побочные эффекты, не определены.
Да, printf имеет возвращаемое значение, которое является количеством символов печатных или -1
если есть ошибка, в этом случае не предполагая никакой ошибки возвращаемого значения будет 3
как для внутреннего printf
s
аргументы функции вычисляются до того, как функция вызывается поэтому внутренние printf
s выполнены первый, это рассматривается в разделе 6.5.2.2
функция вызывает пункт :
Аргумент может быть выражением любого типа объекта. При подготовке к вызову к функции, аргументы вычисляются, и каждый параметр имеет значение соответствующего argument.81)
Это не неопределенное это не указано, большая разница –
Совершенно верно, я исправлю. –
И волшебное слово: «точки последовательности». –