2016-10-21 3 views
1

У меня есть следующий код C:Выходная проблема в макросах?

#include <stdio.h> 

int x = 2; 
int f (int z) { int temp = x; x += 2*z; return temp; } 

#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) /* side effects may cause error */ 
int MIN_fix(X,Y) { if (X < Y) return X; else return Y; } 

int main() { 
unsigned char b = 0x3, c = 0x1; 
printf("result> %d, %d\n", MIN(b+c, f(3)), MIN_fix(b+c, f(3))); 
} 

почему я получаю "результат> 4, 2" она должна быть 8 вместо 4?

+4

Вы заметили комментарий '/ * побочные эффекты могут привести к ошибке */'? – kdopen

+1

Кроме того, ваша программа имеет неопределенное поведение, потому что оценки второго и третьего аргументов вашего вызова 'printf' имеют побочные эффекты на переменной' x', и они не упорядочены относительно друг друга. –

+0

См. Http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function-calling-in-c Возможно дубликат – kdopen

ответ

0

Как это не было 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 

Любой из выходов справедливы - потому что вы Неопределенное поведение

 Смежные вопросы

  • Нет связанных вопросов^_^