#在C中定义x2 | 0
下面给出的代码是为了满足条件(x==x+2)在C中返回true而编写的#在C中定义x2 | 0,c,macros,bitwise-operators,bitwise-or,C,Macros,Bitwise Operators,Bitwise Or,下面给出的代码是为了满足条件(x==x+2)在C中返回true而编写的 #include<stdio.h> #define x 2|0 int main() { printf("%d",x==x+2); return 0; } 什么意思?我在其他问题中阅读了有关宏的内容,但没有问题解释类似的示例。TL;博士阅读 +绑定的级别高于=,后者绑定的级别高于 预处理后,您的printf()语句如下所示 printf("%d",2|0==2|0+2); 这和 p
#include<stdio.h>
#define x 2|0
int main()
{
printf("%d",x==x+2);
return 0;
}
什么意思?我在其他问题中阅读了有关宏的内容,但没有问题解释类似的示例。TL;博士阅读
+
绑定的级别高于=
,后者绑定的级别高于
预处理后,您的printf()
语句如下所示
printf("%d",2|0==2|0+2);
这和
printf("%d",2|(0==2)|(0+2));
那是
printf("%d",2|0|2);
建议:不要在实际场景中编写此类代码。启用最低级别的编译器警告后,代码将生成 所以,当你将宏定义更改为正常的时候,比如
结果也会改变,因为括号将保证显式优先级。TL;博士阅读
+
绑定的级别高于=
,后者绑定的级别高于
预处理后,您的printf()
语句如下所示
printf("%d",2|0==2|0+2);
这和
printf("%d",2|(0==2)|(0+2));
那是
printf("%d",2|0|2);
建议:不要在实际场景中编写此类代码。启用最低级别的编译器警告后,代码将生成 所以,当你将宏定义更改为正常的时候,比如
结果也将改变,因为括号将保证显式优先级。运行预处理器后,
gcc-E main.c
您将得到:
int main()
{
printf("%d",2|0==2|0 +2);
return 0;
}
由于
(0==2)
为0,2 | 0 | 2
运行预处理器后,gcc-E main.c
您将得到:
int main()
{
printf("%d",2|0==2|0 +2);
return 0;
}
由于
(0==2)
是0,2 | 0 | 2
预处理的代码说什么?展开宏。查看运算符优先级表。明白。开明点,我知道你在学习。学习这些东西很好。。。但以后不要真正使用它。@VoidLimbo晦涩而混乱的代码只适用于c00L h4xx0r比赛。#define x 1.0e100
也可能满足x==x+2
预处理代码的要求。展开宏。查看运算符优先级表。明白。开明点,我知道你在学习。学习这些东西很好。。。但是以后不要再使用它了。@VoidLimbo晦涩而混乱的代码只适用于c00L h4xx0r比赛。#define x 1.0e100
也可能满足x==x+2
谢谢你@Sourav我现在就知道了。我也会记住你的建议。我不怎么使用宏,我只是想知道它是怎么工作的。现在我对宏有了更多的了解。谢谢你@Sourav谢谢你@Sourav我现在明白了。我也会记住你的建议。我不怎么使用宏,我只是想知道它是怎么工作的。现在我对宏有了更多的了解。谢谢你@Sourav