void InsertA(SET *A,int elem)
{
if( isMember(*A,elem) == false)
{
*A = *A || 1<<elem;; /*it says its in this row*/
}
}
/*エラー: 関数 InsertA には左辺値が必要です。ここで
*/
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) インダイレクションが最初に実行されます。それらの2つがあります。それらは右から左に関連付けます。つまり、Right one が最初に実行されます。ここには 2 つの逆参照演算子があることを理解することが重要=
です。
2) 1 に対してビット単位の左シフトが実行されます。 3)*A
とビット単位のシフトの結果で論理 OR が実行されます。ゼロまたは非ゼロを評価する場合があります。4) このゼロ/非ゼロ値は に割り当てられ*A
ます。ここでは、演算子*A
のコンテキストで左辺値として扱うことができます。=
この考慮を怠ると、あいまいさが生じます。のような逆参照操作は*A
、rvalue
または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}
冗長すぎる説明: これは、複雑な式を言語規則で分析する方法を見つけようとする将来のユーザーにとって役立つと思います。
|| ビット演算ではなく、論理演算です。| に変更してみましたか?
A = を実行するたびに、*A と同じように、一時的な A を作成する可能性があります。= 演算子の使用には注意し、コピー コンストラクターを無効にする方法を調べてください。
|= 演算子を使用できます。|= (1 << なんでも)
編集: C++ モードで C++ コンパイラを使用して C コードをコンパイルしていないことを確認してください。GCC には C 用のスイッチがあり、ビルド環境によって異なります。
コメントに記載されているように、コードはコンパイルする必要があります。しかし、 に少し設定したいように見えるint
ので、 .|
の代わりに||
. だからあなたはすべきです
*A |= 1<<elem;