Разыменование происходит первым. Это то же самое, что и любой другой постинкремент: используется оригинальное значение.
См., Например, Постинкремент относительно пунктов последовательности
Однако ваш вопрос, похоже, заключается в том, вызовет ли использование указателя функции внутри foo()
вызов 100 * или bar()
.
http://newsgroups.derkeiler.com/Archive/Comp/comp.std.c/2009-10/msg00053.html - это обсуждение в comp.std.c с заголовком «проблема точки последовательности», в котором обсуждается именно эта точка. Я не думаю, что это достигло консенсуса, но с обеих сторон были веские аргументы.
По моему предыдущему прочтению стандарта, это вызвало бы неопределенное поведение.
Вызов функции действует как точка последовательности, но в приложении C говорится только, что она действует как точка последовательности относительно выражений, переданных в качестве параметров - они гарантированно будут оценены, но больше ничего не обязательно (в f(i++) + g(j++)
доступ к i
в g()
или j
в f()
вызывает неопределенное поведение.)
Однако, 6.5.5.2 (p 10) говорит:
Существует точка последовательности после
оценки обозначения функции
и фактические аргументы, но до
фактический звонок.
, что означает, что выполняет последовательность ++
.