在宏中使用三元运算符
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
中使用 ||
而不是 &&
SMALLCASE
和 UPPERCASE
宏中的括号错误(只有一个 (
但两个 )
)
- 删除
SMALLCASE
和 UPPERCASE
宏中的分号
- 更喜欢使用 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");
}
我正在尝试将 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
中使用||
而不是&&
SMALLCASE
和UPPERCASE
宏中的括号错误(只有一个(
但两个)
)- 删除
SMALLCASE
和UPPERCASE
宏中的分号 - 更喜欢使用 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");
}