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?

2

4 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 sub­expression 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)) 
3

In 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.

0

You test k = M instead of k == M.
Maybe it is what you want to do, in this case, write if (match == 0 && (k = M))

0

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.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy