Вызов макроса из вызова макроса - PullRequest
0 голосов
/ 27 сентября 2018

Почему следующий код не выводит максимум трех чисел?

#include<stdio.h>

#define max(a,b) (a>b)?(a):(b)
#define min(a,b) (b>a)?(a):(b)

int main()
{
    printf("%d",max(2,max(1,4)));
    return 0;
}

Это приводит к:

Output: 2

Вызов макроса в вызове макроса невозможен?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вызов макроса в вызове макроса невозможен?

Возможно вложить вызов макроса


Чтобы получить желаемую функциональность, поместите() вокруг каждого параметра и () вокруг всего выражения.

// #define max(a,b) (a>b)?(a):(b)
#define max(a,b) (((a)>(b)) ? (a) : (b))

Без разумного использования () код может оцениваться не так, как ожидалось, когда аргумент нетривиален какb во внешнем вызове max(a,b) в max(2,max(1,4))

0 голосов
/ 27 сентября 2018

max(2, max(1,4)) расширяется до (2> (1>4)?(1):(4) )?(2):( (1>4)?(1):(4) ) УВЕДОМЛЕНИЕ 2> (1>4)? равно 2 > false == 2 > 0, что верно.Таким образом, 2 является значением.

, чтобы исправить это, добавьте несколько скобок:)

#include <stdio.h>
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((b)>(a))?(a):(b))

int main()
{
    printf("%d",max(2, max(1,4)));

    return 0;
}
...