Это странно, что это работает и выглядит как ошибка (или функция) из gcc
и clang
при разборе аргументов командной строки.
Похоже, gcc
заменяет первый знак =
в объявлении макроса пробелом.Таким образом, параметр:
-D b+=2
равен
#define b+ 2
, который, поскольку gcc
имеет расширение для его интерпретации таким образом, равен
#define b + 2
, который делает вывод препроцессора:
printf("%d\n", 2 + 2 | ~ 2 + 2);
выражение 2 + 2 | ~ 2 + 2
равно (2 + 2) | ((~ 2) + 2)
(см. приоритет оператора ), которое в twos дополняет системуравно 4 | (-3 + 2)
, что равно 4 | -1
.На два дополнения -1
равно 0xff....ff
, поэтому 4 | -1
равно 0xff...ff
(как двоичное ИЛИ), что составляет -1
.