Подтвердить что ты не робот

Выражение должно быть модифицируемым значением lvalue

У меня есть следующий код:

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 )

это нормально. Может ли кто-нибудь объяснить это мне?

4b9b3361

Ответ 1

Оператор присваивания имеет более низкий приоритет, чем &&, поэтому ваше условие эквивалентно:

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

Но в левой части это значение r, а именно логическое значение, полученное в результате оценки выражения sub & shy; match == 0 && k, поэтому вы не можете назначить ему.

Напротив, сравнение имеет более высокий приоритет, поэтому match == 0 && k == m эквивалентно:

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

Ответ 2

В C вы также столкнетесь с той же ошибкой, если объявите:

char array[size];

и попробуйте назначить значение без указания позиции индекса:

array = '\0'; 

Выполняя:

array[index] = '0\';

Вы указываете ранее объявленный/модифицируемый адрес.

Ответ 3

Помните, что один = всегда является назначением на C или С++.

Ваш тест должен быть if ( match == 0 && k == M ), вы сделали опечатку в тесте k == M.

Если вы действительно имеете в виду k=M (т.е. связанное с назначением присваивание внутри теста), вы должны прочитать код причины if (match == 0 && (k=m) != 0), но большинство правил кодирования советуют не писать это.

Кстати, ваша ошибка предполагает запросить все предупреждения (например, -Wall опция g++) и обновить до последних компиляторов. Следующий GCC 4.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 )
                               ^

и Clang 3.1 также сообщает вам ederman.cc:9:30: error: expression is not assignable

Поэтому используйте последние версии бесплатных компиляторов и включите все предупреждения при их использовании.

Ответ 4

Вы тестируете k = M вместо k == M.
Возможно, это то, что вы хотите сделать, в этом случае напишите if (match == 0 && (k = M))