2017-01-21 9 views
4

次のコードスニペットではコンパイルエラーは発生しませんが、期待される出力が得られませんが、これは単純なif-else方法で行うことができますが、マクロを使用してやりたいと思います。ここではcは文字変数です。 VOWELSマクロの左端の値ではなく、すべてがないあるためだ与えられた文字が母音かどうかをテストするマクロをどのように定義できますか?

#define VOWELS 'a' || 'e' || 'i' || 'o' || 'u' || 'A' || 'E' || 'I' || 'O' || 'U' 

      if(c == VOWELS) 

      { 
       printf("vowel = %c\n", c); 
      } 
+1

です。 'if(c == 'a' || 'e' || 'i' || ....)が結果です。あなたが手入力した場合、それは望みどおりに機能しませんので、マクロの使用は形式的なものです。だから自分自身に尋ねなさい、あなたが望むものに拡大表現をどのように変えるのだろうか?次に、マクロで可能かどうかを尋ねます(おそらくパラメータ化されたマクロ?)。 – WhozCraig

+0

[可能な場合はコンパートメントの条件を記述する方法がありますか?](http://stackoverflow.com/questions/39150884/is-there-a-shorter-way-to-write-compound-if-条件) – technosaurus

答えて

7

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)) 
{ 
    ... 
} 
3

これはc==aをチェックします

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

に展開され、ゼロ以外の値を持つeと論理和をとります。結果は常にTRUEになります。何をしたい

は、私はあなたが常にちょうど前処理、あるいは手で代用これを自分で行うと、生成されたものを見ることができたと仮定し

#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); 
} 
関連する問題