In this tutorial you will know about one of the most occurred error in C and C++ programming, i.e. lvalue required as left operand of assignment.
lvalue means left side value. Particularly it is left side value of an assignment operator.
rvalue means right side value. Particularly it is right side value or expression of an assignment operator.
In above example a is lvalue and b + 5 is rvalue.
In C language lvalue appears mainly at four cases as mentioned below:
- Left of assignment operator.
- Left of member access (dot) operator (for structure and unions).
- Right of address-of operator (except for register and bit field lvalue).
- As operand to pre/post increment or decrement for integer lvalues including Boolean and enums.
Solve error: lvalue required as left operand of assignment
Now let see some cases where this error occur with code.
When you will try to run above code, you will get following error.
Solution: In if condition change assignment operator to comparison operator, as shown below.
Above code will show the error: lvalue required as left operand of assignment operator.
Here problem occurred due to wrong handling of short hand operator (*=) in findFact() function.
Solution: Just by changing the line ans*i=ans to ans*=i we can avoid that error. Here short hand operator expands like this, ans=ans*i. Here left side some variable is there to store result. But in our program ans*i is at left hand side. It’s an expression which produces some result. While using assignment operator we can’t use an expression as lvalue.
The correct code is shown below.
Above code will show the same lvalue required error.
Reason and Solution: Ternary operator produces some result, it never assign values inside operation. It is same as a function which has return type. So there should be something to be assigned but unlike inside operator.
The correct code is given below.
Some Precautions To Avoid This Error
There are no particular precautions for this. Just look into your code where problem occurred, like some above cases and modify the code according to that.
Mostly 90% of this error occurs when we do mistake in comparison and assignment operations. When using pointers also we should careful about this error. And there are some rare reasons like short hand operators and ternary operators like above mentioned. We can easily rectify this error by finding the line number in compiler, where it shows error: lvalue required as left operand of assignment.
Comment below if you have any queries related to above tutorial.
// misunderstanding ternary operator
Steps to build mips toolchain
1. Make Windows NTFS case sensitive
Crosstool-NG needs case sensitive file system. To achieve this set the registry value
to 0 and reboot the machine.
2. Install Cygwin
Cygwin 32-bit is recommended for most compatibility (latest version 2.4.1). Download setup-x86.exe and run install. The default path is .
Highlight additional packages (dependencies are added automatically):
- vim (optional)
After installation is complete run and enter bash shell. It will emulate normal linux shell as close as possible and everything will be operated from there.
/opt is where final toolchain will be placed, /src is for crosstool-NG sources.
3. Install crosstool-NG
The latest version for the moment is 1.22.0, take it from the official site
If configure complains about some missing package, run setup-x86.exe again and install it
4. Run crosstool-NG
Paths and misc options
Bitness=32 bits (default)
Tune for cpu=mips32r2
Tuple’s vendor string=gcw0
Toolchain type=cross (default)
Linux kernel=4.3 (default)
binutils version=2.25.1 (default)
gcc version=5.2.0 (default)
Configuration file=uclibc.config (download from here)
Threading implementations to use=linuxthreads
Save an alternate configuration file = gcw0.config and .config
5. Run build
Attention! There may be problems with linux-headers (wrong urls) etc.
6. Adding libraries
After compilation is done you’ll get the toolchain in /opt/gcw-toolchain, but this is a minimalistic toolchain without additional libraries like SDL, mikmod etc.
The right way to populate the toolchain with libraries is to compile them from sources, but in fact all headers and libraries could be just copied from ready-to-use linux toolchain.
Copy the following text to copy_libs.sh, place it to /opt and run.