为什么我得到的答案是“奇数”而不是“偶数”?
#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;
}
答案 0 :(得分:3)
ODD(a+1)
扩展为a+1%2?0:1
。 a
为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)
答案 1 :(得分:2)
1被视为true,0被视为false。
始终会执行if (1)
,当您获得0
时,分支会转移到else
所以代码应该是:
如果ODD为真(从terneray表达式返回1),则打印“odd”
答案 2 :(得分:1)
#define ODD(x) x % 2 ? 0 : 1
给定偶数x
,x % 2
会给你零,这是假的。
因此,整个三元表达式的结果将是第二个选项1
,这是真的。
你最好用以下的东西:
#define ODD(x) (((x) % 2) != 0)
它在意图上更具可读性,并且不容易出现错误,例如将真/假值混淆,或者被具有意外效果的简单文本替换所焚烧。
答案 3 :(得分:1)
我不喜欢这种宏,原因很多(其中一个原因是它们可能是愚蠢错误的来源 - 就像你的情况一样)。它应该是函数域。
int ODD(int x)
{
return x & 1;
}
如果你担心函数调用开销只是让它内联(但是在任何级别的op优化中,编译器都会内联它,因为调用可能比函数本身更长。