почему второй оператор создает Assigning to non-lvalue '' main. c? - PullRequest
0 голосов
/ 28 мая 2020

привет, в чем разница между этими операторами, приведенными ниже?

 #define RES_WRITE 0Xf0f0
 #define DATA (0x0000 |= (1<<15))
 #define DATA (RES_WRITE |= (1<<15))

когда DATA присваивается переменной типа int, отображается ошибка типа «Присвоение значения, отличного от lvalue. Могу ли я узнать причину этой ошибки и как устранить ошибку, какую ошибку я делаю?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

x |= y - это сокращение для x = x | y, поэтому вы получите

0 = 0 | (1 << 15)

В этом выражении вы пытаетесь присвоить что-то литералу, что невозможно. Также | является избыточным, поскольку 0 | x всегда просто x.

Из вашего комментария «Я хочу замаскировать разные биты, а затем назначить все биты одной переменной» Похоже, вам нужны простые константы, которые маскируют один бит:

#define DATA (1 << 15)

, которое является целым числом только с 1 битом, которое можно использовать в качестве маски. По разным причинам вы должны предпочесть constexpr макросам в современном C ++:

constexpr unsigned DATA = 1 << 15;

Вы можете использовать оба, как вы упомянули

auto x = DATA | 0x00f0 | 0x0100;
0 голосов
/ 28 мая 2020

Я думаю, вы хотите отправить 0b1000000000000000 на порт микроконтроллера или глобально в буфер. изменить | = на |

почему вы столкнулись с ошибкой?

рассмотрите один из ваших макросов:

#define DATA (0x0000 |= (1<<15))

в этом макросе вы пытаетесь сделать так:

0x0000 = 0x0000 | (1<<15))

можно ли записать данные на 0x0000 ? 0x0000 - значение; это означает, что у него нет места в памяти.

...