【问题标题】:Using the ternary operator in a macro在宏中使用三元运算符
【发布时间】:2016-04-30 15:28:50
【问题描述】:

我正在尝试将 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。使用常规if。更好的是,扔掉所有这些东西并使用if(isalpha(ch))
  • 如果你使用 char 字面量而不是幻数,你的代码就不会那么神秘了。
  • 有理由不使用&lt;ctype.h&gt;中的isalpha()吗?
  • @LưuVĩnhPhúc:请注意,'A' 通常是 65(不是 64),'Z' 通常是 90;同样,'a' 通常是 97,'z' 通常是 122。这说明了为什么这些数字是个坏主意!您还需要注意在平等上以正确的方式分支(&gt;= 'a'&lt;= 'z' 等)。

标签: c macros ternary-operator


【解决方案1】:

这里有几个错误。

  • 您不能使用#if,因为预处理器不知道您将输入的字符。
  • 在宏TEST 中使用|| 而不是&amp;&amp;
  • 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");
}

【讨论】:

  • 像魅力一样工作。谢谢!
  • @GineetMehta 欢迎来到 Stack Overflow!如果您认为此答案有帮助,请选中它旁边的复选标记,表明它是正确的并且对您最有帮助。
  • 您需要将扩展​​中的X 括在各自的括号中,这样如果将表达式传递给宏,事情就不会出错。例如,如果有人使用SMALLCASE(ch &amp; 0x7F),这些宏可能会出现问题。
【解决方案2】:

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

【讨论】:

  • 我试过这个,但似乎没有用。没有编译时错误,但没有给出所需的输出。
  • @GineetMehta 查看@jyvet 的回答,原因是您使用的是预处理器#if 而不是运行时if。用户输入不能在编译时处理,只能在运行时处理。
  • 是的,因为您不能使用#if,而是使用if 没有哈希标签#
  • 哦,有道理。谢谢@PatrickRoberts,这真的很有帮助!
  • 从技术上讲,您可以使用#if TEST(ch),但它正在寻找名为ch 的宏,如果未定义,则将替换值0。它仍然绝对不是我们想要的,但它确实可以编译——尽管是出乎意料的。
猜你喜欢
  • 2012-04-02
  • 2013-12-02
  • 2013-07-06
  • 1970-01-01
  • 2011-09-10
  • 2020-11-23
  • 2018-12-14
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多