【问题标题】:Why am I getting the answer "odd" instead of "even"为什么我得到的答案是“奇数”而不是“偶数”
【发布时间】:2017-08-03 01:37:31
【问题描述】:

为什么我得到的答案是“奇数”而不是“偶数”?

#include<stdio.h>
#define ODD(x) x%2?0:1
int main()
{
    int a=5;

    if(ODD(a+1))
        printf("even");
    else
        printf("odd");

    return 0;
}

【问题讨论】:

  • 虽然在这种情况下这无关紧要,因为 %+ 的优先级高于 ? ,但在使用宏的参数时应始终将它们括在括号中。请参阅此答案以了解原因:stackoverflow.com/a/29248016/1212725
  • @bruceg % 具有比 + 更高的优先级确实,这使得 x%2?0:1ODD(a+1) 存在问题
  • 如果宏应该在偶数时返回 true,为什么还要调用 ODD
  • @AjayBrahmakshatriya OP 的输出肯定反映了 a 的奇数/偶数。使用a+1,将反转文本输出。这是宏参数中() 值的练习。
  • @chux 你是对的。 % 在 + 之前应用,这就是为什么你总是将宏的参数括在括号中!!!

标签: c


【解决方案1】:

ODD(a+1) 扩展为 a+1%2?0:1a 等于 5,这与 (5+(1%2))?0:1 或 0 相同。
% 击败 +,后者击败 ?:

if(0)
    printf("even");
else
    printf("odd");  // print `odd`

也许您想要一些() 来确保评估顺序。

// #define ODD(x) x%2?0:1
#define ODD(x) ((x)%2?0:1)

然而,这似乎倒退了。怎么样

#define ISODD(x) ((x)%2 != 0)

How do I check if an integer is even or odd?

【讨论】:

    【解决方案2】:

    1 被视为真,0 被视为假。
    if (1) 总是被执行,当你得到0 作为结果时,分支转移到else

    所以代码应该是:

    如果奇数为真(从三元表达式返回1),打印“奇数”

    【讨论】:

      【解决方案3】:
      #define ODD(x) x % 2 ? 0 : 1
      

      给定偶数xx % 2 会给你零,这是错误的。

      因此整个三元表达式的结果将是第二个选项1,这是真的。

      你会更好:

      #define ODD(x) (((x) % 2) != 0)
      

      它在意图上更具可读性,并且不太容易出错,例如混淆真/假值,或者被简单的文本替换烧毁,产生意想不到的效果。

      【讨论】:

        【解决方案4】:
        1. 我不喜欢这种 if 宏有很多原因(其中一个原因是它们可能是愚蠢错误的来源 - 就像你的情况一样)。它应该是功能域。

          int ODD(int x)
          {
             return x & 1;
          }
          

        如果您担心函数调用开销,只需将其内联(但在任何级别的操作优化中,编译器都会内联它,因为调用可能比函数本身更长。

        【讨论】:

        • x &amp; 1 使用罕见的Ones' complement 错误地报告负值的奇数。
        • @chux 很重要,你不得不提到它——因为这个系统在我出生之前就已经停止使用了(注意我已经 50 岁了),我并不太担心如果它适用于 CDC、UNIVAC 或 PDP-1
        • 我仍然不关心 univac 机器。没有人在新设计中再使用这个系统(实际上是在过去的 50 多年里)。所以它只是一个复古的大型机问题,没有任何实用价值。顺便说一句,ENIAC 怎么样?我没有找到有关这台计算机使用的格式的任何信息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2018-05-31
        • 2019-04-21
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        相关资源
        最近更新 更多