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

时间:2017-01-21 06:21:50

标签: c macros

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

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


2 个答案:

答案 0 :(得分:7)

这是因为VOWELS宏中除最左边的值之外的所有内容都是而不是正在针对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))
{
    ...
}

答案 1 :(得分:3)

这将扩展为

if(c == 'a' || 'e' || 'i' || 'o' || 'u' || 'A' || 'E' || 'I' || 'O' || 'U')

将检查c==a,然后将逻辑OR与e进行逻辑或非零值。所以结果总是为真。

你想要的是

 #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);
}   
相关问题