Выражение должно быть модифицируемым значением 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 )
это нормально. Может ли кто-нибудь объяснить это мне?
Ответы
Ответ 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))