在宏中使用三元运算符

Using the ternary operator in a macro

我正在尝试将 2 个宏模板组合成第三个宏模板,以基本上检查输入的字符是否为字母表。我试图在前两个宏中使用三元运算符,然后使用 #if 指令得出结论,但不断出现一些语法错误。有人可以帮我吗?

#define SMALLCASE(X) (X>96&&X<123)?1:2); 
#define UPPERCASE(X) (X>64&&X<91)?1:2);
#define TEST(X) (SMALLCASE(X))&&(UPPERCASE(X))

/*in main() after reading character*/
#if TEST(ch)
printf("Entered character is an alphabet");
#else
printf("Entered character isn't an alphabet");
#endif
printf("%d",SMALLCASE(ch));

你这里有几个错误。

  • 您不能使用 #if,因为预处理器不知道您要输入的字符。
  • 在宏 TEST 中使用 || 而不是 &&
  • SMALLCASEUPPERCASE 宏中的括号错误(只有一个 ( 但两个 )
  • 删除 SMALLCASEUPPERCASE 宏中的分号
  • 更喜欢使用 char 值(如 'a')而不是其 ASCII 值(例如 97)

那你可以做什么:

#define SMALLCASE(X) (((X)>='a') && ((X)<='z'))
#define UPPERCASE(X) (((X)>='A') && ((X)<='Z'))
#define TEST(X) ((SMALLCASE(X)) || (UPPERCASE(X)))

/*in main() after reading character*/
if (TEST(ch)) {
    printf("Entered character is an alphabet\n");
} else {
    printf("Entered character isn't an alphabet\n");
}

首先你必须删除分号。除此之外,您的宏 TEST 始终为真。像这样调整您的代码:

#define SMALLCASE(X) ( (X) >= 'a' && (X) <= 'z' ) 
                                              // ^ removed ;
#define UPPERCASE(X) ( (X) >= 'A' && (X) <= 'Z' )
                                              // ^ removed ; 
#define TEST(X) ( SMALLCASE(X) || UPPERCASE(X) )

这里是三元运算符的解决方案:

#define SMALLCASE(X) ( ( (X) >= 'a' && (X) <= 'z' ) ? 1 : 2 )
#define UPPERCASE(X) ( ( (X) >= 'A' && (X) <= 'Z' ) ? 1 : 2 )
#define TEST(X) ( SMALLCASE(X) == 1 || UPPERCASE(X) == 1 )   

此外,您不能在预处理器语句中使用变量;您要么使用其他预处理器语句并定义 ch:

#define ch 'a'

#if TEST(ch)
    printf("Entered character is an alphabet");
#else
    printf("Entered character isn't an alphabet");
#endif

或者您使用 if 语句:

if ( TEST(ch) )
{
    printf("Entered character is an alphabet");
}
else
{
    printf("Entered character isn't an alphabet");
}