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
这样的解引用操作。作为rvalue
或value
要使用的。实际上它是有效的 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/