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

时间:2017-08-03 01:37:31

标签: c

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

#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;
}

4 个答案:

答案 0 :(得分:3)

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?

答案 1 :(得分:2)

1被视为true,0被视为false。
始终会执行if (1),当您获得0时,分支会转移到else

所以代码应该是:

如果ODD为真(从terneray表达式返回1),则打印“odd”

答案 2 :(得分:1)

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

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

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

你最好用以下的东西:

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

它在意图上更具可读性,并且不容易出现错误,例如将真/假值混淆,或者被具有意外效果的简单文本替换所焚烧。

答案 3 :(得分:1)

  1. 我不喜欢这种宏,原因很多(其中一个原因是它们可能是愚蠢错误的来源 - 就像你的情况一样)。它应该是函数域。

    int ODD(int x)
    {
       return x & 1;
    }
    
  2. 如果你担心函数调用开销只是让它内联(但是在任何级别的op优化中,编译器都会内联它,因为调用可能比函数本身更长。