Как это не было downvoted или закрыт как дубликат, я попытаюсь объяснить
Давайте посмотрим на ваш printf
вызов:
printf("result> %d, %d\n", MIN(b+c, f(3)), MIN_fix(b+c, f(3)));
Теперь b+c
фактически является постоянной величиной (4), так что это превращается в
printf("result> %d, %d\n", MIN(4, f(3)), MIN_fix(4, f(3)));
Если мы расширим макрос invokation MIN
, и удалить ненужные скобки, получим followi нг
printf("result> %d, %d\n", 4 < f(3)? 4 : f(3), MIN_fix(4, f(3)));
Таким образом, мы имеем 3 вызовы к f(3)
в этой строке кода. Первые три вызова этой функции возвращают 2, 8 и 14 соответственно. Но нет никакой гарантии, в каком порядке эти вызовы будут оцениваться.
Давайте дадим f1 = 2, f2 = 8 и f3 = 14. Ваш Printf может быть любым из следующих с их выходом в комментарии
printf(..., 4<f1?4:f2, MIN_fix(4,f3)); // 8, 4
printf(..., 4<f1?4:f3, MIN_fix(4,f2)); // 14, 4
printf(..., 4<f2?4:f1, MIN_fix(4,f3)); // 4, 4
printf(..., 4<f2?4:f3, MIN_fix(4,f1)); // 4, 2
printf(..., 4<f3?4:f1, MIN_fix(4,f3)); // 4, 4
printf(..., 4<f3?4:f2, MIN_fix(4,f1)); // 4, 2
Любой из выходов справедливы - потому что вы Неопределенное поведение
Вы заметили комментарий '/ * побочные эффекты могут привести к ошибке */'? – kdopen
Кроме того, ваша программа имеет неопределенное поведение, потому что оценки второго и третьего аргументов вашего вызова 'printf' имеют побочные эффекты на переменной' x', и они не упорядочены относительно друг друга. –
См. Http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function-calling-in-c Возможно дубликат – kdopen