为啥第二条语句创建分配给非左值''main.c?

Posted

技术标签:

【中文标题】为啥第二条语句创建分配给非左值\'\'main.c?【英文标题】:why does the 2nd statement creates Assigning to non-lvalue '' main.c?为什么第二条语句创建分配给非左值''main.c? 【发布时间】:2020-05-28 11:28:14 【问题描述】:

您好,下面给出的这些语句有什么区别?

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

当 DATA 被分配给一个 int 变量时,它会显示一个错误,比如“Assigning to non-lvalue. 我可以知道这个错误背后的原因以及如何解决这个错误我在做什么?

【问题讨论】:

0x0000 |= (1&lt;&lt;15) - 你想在这里做什么?您不能将值写入文字。 |= 是一个赋值运算符,就像 += 一样,除了它是按位或代替加法。出于完全相同的原因,表达式 0 += 1 会给出类似的诊断结果 - 赋值运算符的左侧必须是可以赋值的东西。 你可能只想要|而不是|= DATA 基本上扩展到 0 = 1 MACRO 不是语句,并且不清楚您的意思是 “何时分配 DATA” 【参考方案1】:

x |= yx = x | y 的简写,所以你最终会得到 ​​p>

0 = 0 | (1 << 15)

在此表达式中,您试图将某些内容分配给文字,这是不可能的。 | 也是多余的,因为 0 | x 始终只是 x

从您的评论 “我想屏蔽不同的位,然后将所有位分配给一个变量” 似乎您想要简单的常量来屏蔽单个位:

#define DATA (1 << 15)

这是一个整数,只有1位设置,可以用作掩码。由于各种原因,您应该更喜欢 constexpr 而不是现代 C++ 中的宏:

constexpr unsigned DATA = 1 << 15;

你可以像你提到的那样使用两者

auto x = DATA | 0x00f0 | 0x0100;

【讨论】:

我更喜欢 unsigned 类型的标志。【参考方案2】:

我认为您想将 0b1000000000000000 发送到微控制器的端口或全局发送到缓冲区。 将 |= 更改为 |

为什么你会遇到错误?

考虑你的一个宏:

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

在这个宏中,你尝试这样做:

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

是否可以在 0x0000 上写入数据? 0x0000 是值;这意味着它在内存中没有任何位置。

【讨论】:

1 &lt;&lt; 150b1000'0000'0000'0000(或 0x80'00)而不是 0x10'00'00'00'00'00'00'00 :)。

以上是关于为啥第二条语句创建分配给非左值''main.c?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当分配看起来合适时指针分配显示左值错误?

为啥我需要将默认引用参数定义为 const 以便我可以为其分配左值? [复制]

sql语句查询出表里符合条件的第二条记录的方法

选择第二条到第四条的sql语句怎么写?

为啥左值转换有效?

取消引用的指针是有效的左值吗?