C 如何定义测试给定字符是否为元音的宏?

C 如何定义测试给定字符是否为元音的宏?,c,macros,C,Macros,下面的代码片段没有给出编译错误,但也没有给出预期的输出,尽管这可以用简单的if-else方法完成,但我想用宏来完成。这里c是一个字符变量 #define VOWELS 'a' || 'e' || 'i' || 'o' || 'u' || 'A' || 'E' || 'I' || 'O' || ' if (c == VOWELS) { printf("vowel = %c\n", c); } 这是因为除了元音宏中最左边的值之外,其他所有值都没有根据c进行测试。宏扩展为: c == 'a

下面的代码片段没有给出编译错误,但也没有给出预期的输出,尽管这可以用简单的if-else方法完成,但我想用宏来完成。这里
c
是一个字符变量

#define VOWELS 'a' || 'e' || 'i' || 'o' || 'u' || 'A' || 'E' || 'I' || 'O' || '
if (c == VOWELS) {
   printf("vowel = %c\n", c);
}



这是因为除了
元音
宏中最左边的值之外,其他所有值都没有根据
c
进行测试。宏扩展为:

c == 'a' || 'e' || ...
因此,基本上,由于测试的是非零表达式(即字符
'e'
的数值),因此其计算结果总是
1

宏应该是:

#define VOWEL(c) ((c) == 'a') || ((c) == 'e') || ((c) == 'i') || ((c) == 'o') || ((c) == 'u') || ((c) == 'A') || ((c) == 'E') || ((c) == 'I') || ((c) == 'O') || ((c) == 'U')
然后,您只需使用:

if(VOWEL(c))
{
    ...
}
这将扩展到

if(c == 'a' || 'e' || 'i' || 'o' || 'u' || 'A' || 'E' || 'I' || 'O' || 'U')
它将检查
c==a
,然后用非零值的
e
进行逻辑OR。因此,结果总是正确的

你想要的是

 #define VOWELCHECK(c) ((c)=='a') || ((c)=='e') || ((c)=='i') || \
                       ((c)=='o') || ((c)=='u') || ((c)=='A') || \
                       ((c)=='E') || ((c)=='I') || ((c)=='O') || ((c)=='U')))


// In the program
if (VOWELCHECK(c))
{
   printf("vowel = %c\n", c);
}   

我想你总是可以做预处理,甚至自己动手替换,看看生成了什么<代码>如果(c='a'| |'e'| | |'i'| |……)是结果。如果您手工输入,它也不会按预期工作,因此使用宏在某种程度上是一种形式。所以问问你自己,你将如何改变这个扩展表达式,使之成为你想要的?然后询问是否可以使用宏(可能是参数化宏?)。是否可能重复