I have this following code:
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; } } But it gives out an error saying:
Error: expression must be a modifiable value
on that "if" line. I am not trying to modify "match" or "k" value here, but why this error? if I only write it like:
if ( match == 0 ) it is ok. Could someone explain it to me?
24 Answers
The assignment operator has lower precedence than &&, so your condition is equivalent to:
if ((match == 0 && k) = m) But the left-hand side of this is an rvalue, namely the boolean resulting from the evaluation of the subexpression match == 0 && k, so you cannot assign to it.
By contrast, comparison has higher precedence, so match == 0 && k == m is equivalent to:
if ((match == 0) && (k == m)) 3In C, you will also experience the same error if you declare a:
char array[size]; and than try to assign a value without specifying an index position:
array = '\0'; By doing:
array[index] = '0\'; You're specifying the accessible/modifiable address previously declared.
0You test k = M instead of k == M.
Maybe it is what you want to do, in this case, write if (match == 0 && (k = M))
Remember that a single = is always an assignment in C or C++.
Your test should be if ( match == 0 && k == M )you made a typo on the k == M test.
If you really mean k=M (i.e. a side-effecting assignment inside a test) you should for readability reasons code if (match == 0 && (k=m) != 0) but most coding rules advise not writing that.
BTW, your mistake suggests to ask for all warnings (e.g. -Wall option to g++), and to upgrade to recent compilers. The next GCC 4.8 will give you:
% 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 ) ^ and Clang 3.1 also tells you ederman.cc:9:30: error: expression is not assignable
So use recent versions of free compilers and enable all the warnings when using them.