c - 需要 L 值吗? C 编程位模式

标签 c bit-manipulation lvalue

void InsertA(SET *A,int elem)
{
    if( isMember(*A,elem) == false)
    {
    *A = *A || 1<<elem;; /*it says its in this row*/
    }
}

/*错误:函数 InsertA 中需要左值 对这些人有什么想法吗?菜鸟在这里

*/

最佳答案

在此声明中:

*A = *A || 1<<elem;; /*it says its in this row*/

我们有这些运算符*,=,||,<<

现在查看优先级表

Precedence    Operator   operation                  associativity 
               --------   ---------                 ----------------
3                  *       Indirection (dereference)       R to L
7                  <<       Bitwise left shift             L to R
14                 ||       Logical OR                     L to R
16                 =       Direct assignment               R to L

让我们看看会发生什么:

1) 首先执行间接操作。其中有两个。他们将右与左联系起来。这意味着将首先执行正确的操作。重要的是要理解这里有两个解引用运算符,稍后在遇到 = 时将进行不同的考虑。运算符(operator)。

2) 将对 1 执行按位左移。 3) 将与 *A 执行逻辑或以及按位移位的结果。它的值可能为零或非零。 4) 这个零/非零值将被分配给 *A 。这里*A= 的上下文中可以被视为左值运算符(operator)。如果你不考虑这一点,就会导致歧义。因为我们经常想到像*A这样的解引用操作。作为rvaluevalue要使用的。实际上它是有效的 lvalue它将隐式转换为 rvalue (这是当返回存储在value指向的地址处的A时)。否则*A只是内存中的一个对值开放的容器。

所以问题是你的表达式是未定义的,并且没有任何意义为什么你将逻辑值放入 *A 。如果您使用二进制 or 会更有意义而不是逻辑。

让我们这样做:

我们的优先级表中有一个新条目

Precedence OP   OPeration        Associativity 
12         |    Bitwise OR          L to R

只有在步骤 3 执行按位或运算时才会发生变化。

举个例子

可以说elem = 3. A 指向数组 {1,2,3,3,4}

1) '*A' 将被执行。它只会计算 load 所需的“偏移量”或store处理器的指令。

2)我们将得到一个恒定的位模式:1 << 3 = 1000 3)现在为|我们需要rvalues作为两个操作数。所以现在 load将执行指令以获取存储在存储器中的值。说它2 。所以我们会得到0010 | 1000 = 1010 4)将执行存储指令将此位模式放入内存中,因此数组将类似于 {1,A,3,3,4}

对过多冗长的解释:我认为如果 future 的用户尝试找到如何通过语言规则剖析复杂的表达式,这会有所帮助。

关于c - 需要 L 值吗? C 编程位模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11648100/

相关文章:

c - 是否需要转换字符串的字节顺序?

c - 共享内存中的 POSIX 未命名信号量未响应发布或等待

bit-manipulation - 在 Solidity 中将 uint24 转换为 HEX 字符串

c - 为什么 C 中的复合文字是可修改的

c - C 中 Infix-to-Postfix 程序的操作数之间的间距

java - 检查数字的二进制表示形式中所有设置位后仅跟随未设置位的最佳方法

c - 从/proc/pid/stat中的tty_nr属性获取次设备号

c++ - 临时绑定(bind)到左值引用

c - 什么是左值和右值?

c++ - WinAPI - 将文本附加到编辑框的问题