#在C中定义x2 | 0

#在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

下面给出的代码是为了满足条件(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);
这和

 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