52

私はこの次のコードを持っています:

int M = 3; 
int C = 5; 
int match = 3;
for ( int k =0; k < C; k ++ )
{
    match --; 
    if ( match == 0 && k = M )
    {
         std::cout << " equals" << std::endl;
    }
}

しかし、次のようなエラーが発生します。

エラー:式は変更可能な値である必要があります

その「if」行に。ここで「match」または「k」の値を変更しようとはしていませんが、なぜこのエラーが発生するのでしょうか。私がそれを次のように書くだけなら:

if ( match == 0 )

大丈夫です。誰かが私にそれを説明できますか?

4

4 に答える 4

63

代入演算子は よりも優先順位が低い&&ため、条件は次と同等です。

if ((match == 0 && k) = m)

しかし、これの左側は右辺値、つまり部分式 の評価の結果のブール値であるmatch == 0 && kため、それに割り当てることはできません。

対照的に、比較は優先順位が高いため、match == 0 && k == m次と同等です。

if ((match == 0) && (k == m))
于 2012-10-05T11:49:23.713 に答える
42

C で次のように宣言すると、同じエラーが発生します。

char array[size];

そして、インデックス位置を指定せずに値を割り当てようとします:

array = '\0'; 

行うことによって:

array[index] = '0\';

以前に宣言されたアクセス可能/変更可能なアドレスを指定しています。

于 2015-04-17T14:20:57.733 に答える
5

k = Mの代わりにテストしk == Mます。
多分それはあなたがしたいことです、この場合、書きますif (match == 0 && (k = M))

于 2012-10-05T11:48:23.260 に答える
4

=シングルは常にCまたはC++での割り当てであることを忘れないでください。

if ( match == 0 && k == M )あなたのテストはあなたがテストでタイプミスをしたことであるはずですk == M

本当に意味がある場合k=M(つまり、テスト内の副作用の割り当て)、読みやすさの理由からコードを作成する必要がありますif (match == 0 && (k=m) != 0)が、ほとんどのコーディング規則では、それを記述しないようにアドバイスしています。

ところで、あなたの間違いは、すべての警告(たとえば、-Wallへのオプションg++)を要求し、最近のコンパイラにアップグレードすることを示唆しています。次のGCC4.8はあなたに与えるでしょう:

 % g++-trunk -Wall -c ederman.cc
 ederman.cc: In function ‘void foo()’:
 ederman.cc:9:30: error: lvalue required as left operand of assignment
          if ( match == 0 && k = M )
                               ^

そしてClang3.1も教えてくれますederman.cc:9:30: error: expression is not assignable

したがって、無料のコンパイラの最新バージョンを使用し、それらを使用するときにすべての警告を有効にしてください。

于 2012-10-05T11:48:06.193 に答える