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

/*Error: Lvalue required in Function InsertA 对这家伙有什么想法吗?菜鸟在这里

*/

4

3 回答 3

2

在此声明中:

*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) 将首先执行间接。其中有两个。他们将右与左联系起来。这意味着将首先执行正确的一个。重要的是要了解这里有两个解引用运算符,稍后遇到=运算符时会考虑不同。

2) 将对 1 执行按位左移。 3) 将对*A按位移位的结果执行逻辑或。它可以评估零或非零。4) 这个零/非零值将被分配给*A。这里*A可以被视为=运算符上下文中的左值。如果你离开这个考虑,它会导致模棱两可。因为我们经常将取消引用操作视为要使用*A的 anrvalue或 an 。value实际上它是一个有效的lvalue,它将被隐式转换为 a rvalue(这是返回value存储在指向的地址的a 时A)。否则*A只是内存中对值开放的容器。

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

让我们这样做:

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

Precedence OP   OPeration        Associativity 
12         |    Bitwise OR          L to R

只有在执行按位 OR 时,才会在第 3 步中发生变化。

举个例子

假设elem = 3. A 指向数组{1,2,3,3,4}

1) '*A's 将被执行。它只会计算需要执行的“偏移量”loadstore处理器的指令。

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

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

于 2012-07-25T11:46:42.990 回答
0

如评论中所述,代码应编译。但看起来你想在 an 中设置一点int,所以我怀疑你真的想要|而不是||. 所以你应该做

*A |= 1<<elem;
于 2012-07-25T11:06:46.760 回答
0

|| 是逻辑运算,而不是按位运算。您是否尝试将其更改为 |?

每当您执行 A = 时,您就有可能创建一个临时 A,与 *A 相同。小心使用 = 运算符并查看如何禁用复制构造函数。

您可以使用 |= 运算符。A |= (1 << 随便什么)

编辑:确保您没有在 C++ 模式下使用 C++ 编译器编译 C 代码。GCC 有一个用于 C 的开关,这取决于您的构建环境。

于 2012-07-25T11:16:12.857 回答