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

/*エラー: 関数 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つがあります。それらは右から左に関連付けます。つまり、Right one が最初に実行されます。ここには 2 つの逆参照演算子があることを理解することが重要=です。

2) 1 に対してビット単位の左シフトが実行されます。 3)*Aとビット単位のシフトの結果で論理 OR が実行されます。ゼロまたは非ゼロを評価する場合があります。4) このゼロ/非ゼロ値は に割り当てられ*Aます。ここでは、演算子*Aのコンテキストで左辺値として扱うことができます。=この考慮を怠ると、あいまいさが生じます。のような逆参照操作は*Arvalueまたはvalueを使用するように考えられることが多いためです。実際には、lvalue暗黙的に a に変換される有効な a ですrvalue(これは、 がvalue指すアドレスに格納されている aAが返される場合です)。それ以外の場合*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 が実行されます。実行に必要な「オフセット」loadまたはstoreプロセッサの命令を計算するだけです。

2) 一定のビット パターンを取得します1 << 3 = 1000 。3)両方のオペランドとして|必要なためです。rvaluesそのloadため、メモリに格納されている値をフェッチする命令が実行されます。そのと言って2ください。4) このビット パターンを0010 | 1000 = 1010 メモリに格納するストア命令が実行されるため、配列は次のようになります。{1,A,3,3,4}

冗長すぎる説明: これは、複雑な式を言語規則で分析する方法を見つけようとする将来のユーザーにとって役立つと思います。

于 2012-07-25T11:46:42.990 に答える
0

|| ビット演算ではなく、論理演算です。| に変更してみましたか?

A = を実行するたびに、*A と同じように、一時的な A を作成する可能性があります。= 演算子の使用には注意し、コピー コンストラクターを無効にする方法を調べてください。

|= 演算子を使用できます。|= (1 << なんでも)

編集: C++ モードで C++ コンパイラを使用して C コードをコンパイルしていないことを確認してください。GCC には C 用のスイッチがあり、ビルド環境によって異なります。

于 2012-07-25T11:16:12.857 に答える
0

コメントに記載されているように、コードはコンパイルする必要があります。しかし、 に少し設定したいように見えるintので、 .|の代わりに||. だからあなたはすべきです

*A |= 1<<elem;
于 2012-07-25T11:06:46.760 に答える