Проверьте максимальное значение из трех переменных, используя препроцессор в C - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу напечатать значение переменной, которая имеет наибольшее значение. Я хочу сделать это с помощью препроцессора, но я не знаю, как это сделать. Это легко сделать с помощью if-else, но как это сделать с помощью препроцессора? Это мой код

#include <stdio.h>
#define MAX(a,b,c)
#if a > (b && c)
#   define a
#endif
#if b > (a && c)
#   define b
#else
#   define c
#endif

int main (void)
{
    int wynik;
    int a = 6;
    int b = 13;
    int c = 9;
    wynik = MAX(a,b,c);
    printf("%i", wynik);

    return 0;
}

А это ошибки моего терминала

E:\skrypty_c>gcc -o Cwiczenie12_4.exe Cwiczenie12_4.c
Cwiczenie12_4.c: In function 'main':
Cwiczenie12_4.c:17:11: error: expected identifier or '(' before '=' token
     int c = 9;
           ^
Cwiczenie12_4.c:18:23: error: expected expression before ';' token
     wynik = MAX(a,b,c);

Ответы [ 3 ]

4 голосов
/ 08 апреля 2020

Это не так, как это работает. Ваш макрос max-of-Three будет выглядеть примерно так:

#define MAX(a, b, c) ((a) <= (b)? (b) <= (c)? (c) : (b) : (a) <= (c)? (c) : (a))

, но, честно говоря, он будет намного лучше как функция:

inline int max(int a, int b, int c) {
    if(a <= b) {
        if(b <= c) return c;
        return b;
    }
    return a <= c? c : a;
}
3 голосов
/ 08 апреля 2020

Препроцессор не может быть использован для этого. Препроцессор ничего не знает о переменных c и sysntax.

Вы не можете использовать любые условные выражения препроцессора в # определениях.

, если вы хотите использовать макрос, чтобы найти максимум 3 токена, вам нужно использовать для этого выражения C, как это будет оцениваемое время выполнения (или время компиляции), а не во время предварительной обработки

#define MAX(a,b,c)  (a) > (b) ? ((a) > (c) ? (a) : ((c) > (b) ? c : (b))) : ((b) > (c) ? (b) : (c))
1 голос
/ 08 апреля 2020

Вы не можете проверить значение переменных времени выполнения через условные выражения препроцессора. Они могут проверять только значения символов уровня препроцессора. Например,

#define A 5

#if (A  > 3)
...
#endif

Глядя на то, как вы использовали #define и #if, , мое предположение заключается в том, что вы имели в виду определение какой-то функции уровня препроцессора имея #define аналогичную роль def func (): в Python. Это не так.

  • #define A expr просто заменяет символ A на выражение expr в текущем исходном файле до компиляции. Нет вхождений A, никаких подстановок
  • #define A(b,c) expr аналогично предыдущему, но использует b,c подобные параметры функции, и они заменяются в заменяемых в выражение expr с использованием значений, переданных при вызове макроса.
  • #if expr или #ifdef symbol или #ifndef symbol - это способы проверки значения или даже простого определения символов, ранее определенного через #define s (или через опцию компилятора -D), чтобы выполнить условную компиляцию целых разделов кода. Эти разделы закрываются с помощью #endif, а альтернативные разделы в случае ложных условий могут быть скомпилированы с использованием директив #else и #elif.

Что вы можете сделать, и я подозреваю, что это была ваша настоящая цель, это определить макрос, который найдет максимальное значение среди его параметров:

#define MAX(a,b,c) \
    (((a>b) && (a>c))? a : ((b>a) && (b>c))? b : c ))

Я использовал троичный оператор для вычисления максимального значения.

Примечание: символ \ позволяет размещать макрос на нескольких строках. Это должен быть последний символ строки.

...