C Board  

Go Back   C Board > General Programming Boards > C Programming

Reply
 
LinkBack Thread Tools Display Modes
Old 08-21-2009, 05:12 AM   #1
Registered User
 
Join Date: Aug 2009
Posts: 5
Question expression evaluation

Hi,


Although the expression *((a<20)?&b:&c)=30; works but

((a<20)?b:c)=30 gives

error: invalid lvalue in assignment.

what could be the reason for it? Please need sum urgent help.

Thanks in advance.
lazy_hack is offline   Reply With Quote
Old 08-21-2009, 05:31 AM   #2
Registered User
 
hk_mp5kpdw's Avatar
 
Join Date: Jan 2002
Location: Northern Virginia/Washington DC Metropolitan Area
Posts: 2,870
The result of the left hand side of:
Code:
((a<20)?b:c)=30
is a value (the value stored in either b or c). Let's say for example that b is 20 and c is 30. If a is 10 then the result of the left-hand side is 20 and you are effectively trying to say:
Code:
20=30
which would of course give you that error.
__________________
On two occasions I have been asked [by members of Parliament], 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question.
--Charles Babbage, 1792-1871

09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0
hk_mp5kpdw is offline   Reply With Quote
Old 08-21-2009, 05:38 AM   #3
Registered User
 
Join Date: Aug 2009
Posts: 5
Question Help in assigment stmt.

full program:
Code:
main()
{
  int a=10,b,c;
  ((a<20)?b:c)=30;
  printf("%d",b);
 }
this also gives error invalid lvalue in assignment.

but if i replace the line with *((a<20)?&b:&c)=30; it works.

please explain also why the second one works .
lazy_hack is offline   Reply With Quote
Old 08-21-2009, 05:50 AM   #4
C++ Witch
 
laserlight's Avatar
 
Join Date: Oct 2003
Location: Singapore
Posts: 11,362
Quote:
Originally Posted by lazy_hack
but if i replace the line with *((a<20)?&b:&c)=30; it works.

please explain also why the second one works .
You are assigning to what the corresponding pointer points to, and that is not a problem. Where did you come across this code, anyway? It looks like a lazy hack, or rather, bad style.
__________________
C + C++ Compiler: MinGW port of GCC
Build + Version Control System: SCons + Bazaar

Look up a C/C++ Reference and learn How To Ask Questions The Smart Way
laserlight is online now   Reply With Quote
Old 08-21-2009, 07:02 AM   #5
DESTINY
 
BEN10's Avatar
 
Join Date: Jul 2008
Location: in front of my computer
Posts: 803
Quote:
Originally Posted by lazy_hack View Post
full program:
Code:
main()
{
  int a=10,b,c;
  ((a<20)?b:c)=30;
  printf("%d",b);
 }
this also gives error invalid lvalue in assignment.

but if i replace the line with *((a<20)?&b:&c)=30; it works.

please explain also why the second one works .
In the code above b and c are having garbage values, that's why as told to you in post#2, it'll give you error, while using & you are directly "attacking" in the address, thus no error.
__________________
HOPE YOU UNDERSTAND.......

By associating with wise people you will become wise yourself
It's fine to celebrate success but it is more important to heed the lessons of failure
We've got to put a lot of money into changing behavior


PC specifications- 512MB RAM, Windows XP sp3, 2.79 GHz pentium D.
IDE- Microsoft Visual Studio 2008 Express Edition
BEN10 is offline   Reply With Quote
Old 08-21-2009, 07:07 AM   #6
C++ Witch
 
laserlight's Avatar
 
Join Date: Oct 2003
Location: Singapore
Posts: 11,362
Quote:
Originally Posted by BEN10
In the code above b and c are having garbage values, that's why as told to you in post#2, it'll give you error, while using & you are directly "attacking" in the address, thus no error.
That is off the mark. That b and c were not initialised does not matter, since the intention is to assign a value to them. What matters is that the result of the conditional operator is not an lvalue, hence the attempted assignment does not work.
__________________
C + C++ Compiler: MinGW port of GCC
Build + Version Control System: SCons + Bazaar

Look up a C/C++ Reference and learn How To Ask Questions The Smart Way
laserlight is online now   Reply With Quote
Old 08-21-2009, 07:12 AM   #7
DESTINY
 
BEN10's Avatar
 
Join Date: Jul 2008
Location: in front of my computer
Posts: 803
I think hk_mp5kpdw's post is also wrong then.
__________________
HOPE YOU UNDERSTAND.......

By associating with wise people you will become wise yourself
It's fine to celebrate success but it is more important to heed the lessons of failure
We've got to put a lot of money into changing behavior


PC specifications- 512MB RAM, Windows XP sp3, 2.79 GHz pentium D.
IDE- Microsoft Visual Studio 2008 Express Edition
BEN10 is offline   Reply With Quote
Old 08-21-2009, 07:26 AM   #8
C++ Witch
 
laserlight's Avatar
 
Join Date: Oct 2003
Location: Singapore
Posts: 11,362
Quote:
Originally Posted by BEN10
I think hk_mp5kpdw's post is also wrong then.
What do you find wrong about it? hk_mp5kpdw made the point that the result of the conditional operator is not a variable that can be assigned to, but a value that cannot be assigned to.
__________________
C + C++ Compiler: MinGW port of GCC
Build + Version Control System: SCons + Bazaar

Look up a C/C++ Reference and learn How To Ask Questions The Smart Way
laserlight is online now   Reply With Quote
Old 08-21-2009, 07:30 AM   #9
DESTINY
 
BEN10's Avatar
 
Join Date: Jul 2008
Location: in front of my computer
Posts: 803
From hk_mp5kpdw's post, let b has a value of 12345 in the code given by the OP, then this will happen
Code:
12345=30;
That's why the error. This is what I said in my previous post.
__________________
HOPE YOU UNDERSTAND.......

By associating with wise people you will become wise yourself
It's fine to celebrate success but it is more important to heed the lessons of failure
We've got to put a lot of money into changing behavior


PC specifications- 512MB RAM, Windows XP sp3, 2.79 GHz pentium D.
IDE- Microsoft Visual Studio 2008 Express Edition
BEN10 is offline   Reply With Quote
Old 08-21-2009, 07:34 AM   #10
Registered User
 
Join Date: Jun 2009
Location: US of A
Posts: 301
Quote:
Originally Posted by BEN10 View Post
In the code above b and c are having garbage values, that's why as told to you in post#2, it'll give you error, while using & you are directly "attacking" in the address, thus no error.
No you said this. But as laserlight pointed out that the uninitialized b and c are not a problem here. The problem is the assignment being checked

for example as in your case

12345 = 30 // this is wrong
roaan is offline   Reply With Quote
Old 08-21-2009, 08:06 AM   #11
C++ Witch
 
laserlight's Avatar
 
Join Date: Oct 2003
Location: Singapore
Posts: 11,362
Quote:
Originally Posted by BEN10
That's why the error. This is what I said in my previous post.
Fair enough: looking at your post #5 again, I see that I missed the phrase "as told to you in post#2". It would have been clearer if you had given an example there and then, or at least suggested the scenario where 20 and 30 were the "garbage" values of b and c respectively.
__________________
C + C++ Compiler: MinGW port of GCC
Build + Version Control System: SCons + Bazaar

Look up a C/C++ Reference and learn How To Ask Questions The Smart Way
laserlight is online now   Reply With Quote
Old 08-21-2009, 09:37 AM   #12
Registered User
 
Join Date: Aug 2009
Posts: 5
thanks for the explanation...

"the result of the conditional operator is not an lvalue" line is the crux i believe...

the code was from test ur c skills book....just anther intrsting book..
lazy_hack is offline   Reply With Quote
Reply

Tags
? :, assignment, lvalue, pointers

Thread Tools
Display Modes

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Help with making a Math Expression DLL MindWorX C Programming 19 07-19-2007 11:37 PM
Screwy Linker Error - VC2005 Tonto C++ Programming 5 06-19-2007 02:39 PM
recursion error cchallenged C Programming 2 12-18-2006 09:15 AM
Please Help - Problem with Compilers toonlover C++ Programming 5 07-23-2005 10:03 AM
sizeof and Expression Evaluation Dave_Sinkula C Programming 2 08-11-2003 07:11 PM


All times are GMT -6. The time now is 01:14 PM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22