#define x 2|0 в C
Приведенный ниже код написан так, чтобы удовлетворять условию (x == x+2), возвращающему true в C.
#include<stdio.h>
#define x 2|0
int main()
{
printf("%d",x==x+2);
return 0;
}
В приведенном выше коде почему printf()
печатает 2
(если я напишу x+3
я получил 3
и так далее).
Может кто-нибудь объяснить, как работает данный макрос.
Какая польза от |
оператор в C и что делает макрос
#define x 2|0
имею в виду? Я читал о макросах в других вопросах, но ни один вопрос не объяснял подобный пример.
2 ответа
TL;DR; Читайте о приоритете операторов.
+
связывает выше, чем ==
который связывает выше, чем |
,
После предварительной обработки ваш printf()
заявление выглядит
printf("%d",2|0==2|0+2);
который так же, как
printf("%d",2|(0==2)|(0+2));
который
printf("%d",2|0|2);
Совет: не пишите этот тип кода в реальном сценарии. При минимальном уровне предупреждения компилятора ваш код производит
source_file.c: In function ‘main’: source_file.c:4:12: warning: suggest parentheses around comparison in operand of ‘|’ [-Wparentheses] #define x 2|0 ^ source_file.c:8:21: note: in expansion of macro ‘x’ printf("%d\n\n",x==x+2); ^ source_file.c:4:12: warning: suggest parentheses around arithmetic in operand of ‘|’ [-Wparentheses] #define x 2|0 ^ source_file.c:8:24: note: in expansion of macro ‘x’ printf("%d\n\n",x==x+2);
Итак, в тот момент, когда вы измените определение MACRO на что-то вменяемое, как
#define x (2|0)
результат также изменится, так как явный приоритет будет гарантирован круглыми скобками.
После запуска препроцессора, gcc -E main.c
ты получишь:
int main()
{
printf("%d",2|0==2|0 +2);
return 0;
}
поскольку (0==2)
это 0, 2|0|2