为啥第二条语句创建分配给非左值''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<<15)
- 你想在这里做什么?您不能将值写入文字。
|=
是一个赋值运算符,就像 +=
一样,除了它是按位或代替加法。出于完全相同的原因,表达式 0 += 1
会给出类似的诊断结果 - 赋值运算符的左侧必须是可以赋值的东西。
你可能只想要|
而不是|=
DATA 基本上扩展到 0 = 1
MACRO 不是语句,并且不清楚您的意思是 “何时分配 DATA”。
【参考方案1】:
x |= y
是 x = 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 << 15
是 0b1000'0000'0000'0000
(或 0x80'00
)而不是 0x10'00'00'00'00'00'00'00
:)。以上是关于为啥第二条语句创建分配给非左值''main.c?的主要内容,如果未能解决你的问题,请参考以下文章