在宏

时间:2016-01-24 08:30:49

标签: c macros ternary-operator

我试图将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));

2 个答案:

答案 0 :(得分:5)

这里有几个错误。

  • 由于预处理程序不知道您将输入的字符,因此无法使用#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");
}

答案 1 :(得分:1)

首先,您必须删除分号。除此之外,您的宏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");
}