#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

Другие вопросы по тегам