在 C 中使用预处理器检查三个变量的最大值
Check max value from three variables by using preprocessor in C
我想打印具有最高值的变量值。我想通过使用预处理器来做到这一点,但我不知道该怎么做。使用 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);
事情不是这样的。你的 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;
}
您不能通过预处理器条件检查运行时变量的值。他们只能检查预处理器级别符号的值。例如
#define A 5
#if (A > 3)
...
#endif
看看您使用 #define
和 #if
的方式,我猜 是您的意思是定义某种 预处理器级别功能 具有 #define
与 Python 中的 def func ():
类似的作用。 事情不是这样的。
#define A expr
只是将 符号 A
替换为 表达式 expr
在当前源文件编译前。没有出现 A
,没有替换
#define A(b,c) expr
和上一个一样,但是像函数参数一样使用了b,c
,并且在中的replaced中进行了扩展expression 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 ))
我使用了三元运算符来计算最大值。
注意: \
字符允许在多行上放置一个宏。它必须是该行的最后一个字符。
预处理器不能用于此。预处理器对 c 变量和 sysntax 一无所知。
您不能在#defines 中使用任何预处理器条件表达式。
如果您想使用宏来查找最多 3 个标记,您需要为此使用 C 表达式,因为它将在运行时(或编译时)而不是在预处理期间计算
#define MAX(a,b,c) (a) > (b) ? ((a) > (c) ? (a) : ((c) > (b) ? c : (b))) : ((b) > (c) ? (b) : (c))
我想打印具有最高值的变量值。我想通过使用预处理器来做到这一点,但我不知道该怎么做。使用 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);
事情不是这样的。你的 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;
}
您不能通过预处理器条件检查运行时变量的值。他们只能检查预处理器级别符号的值。例如
#define A 5
#if (A > 3)
...
#endif
看看您使用 #define
和 #if
的方式,我猜 是您的意思是定义某种 预处理器级别功能 具有 #define
与 Python 中的 def func ():
类似的作用。 事情不是这样的。
#define A expr
只是将 符号A
替换为 表达式expr
在当前源文件编译前。没有出现A
,没有替换#define A(b,c) expr
和上一个一样,但是像函数参数一样使用了b,c
,并且在中的replaced中进行了扩展expressionexpr
使用调用宏时传递的值。#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 ))
我使用了三元运算符来计算最大值。
注意: \
字符允许在多行上放置一个宏。它必须是该行的最后一个字符。
预处理器不能用于此。预处理器对 c 变量和 sysntax 一无所知。
您不能在#defines 中使用任何预处理器条件表达式。
如果您想使用宏来查找最多 3 个标记,您需要为此使用 C 表达式,因为它将在运行时(或编译时)而不是在预处理期间计算
#define MAX(a,b,c) (a) > (b) ? ((a) > (c) ? (a) : ((c) > (b) ? c : (b))) : ((b) > (c) ? (b) : (c))