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,787
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: 10,357
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: 656
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.......

for( ; ; )
printf("If you can't make it good, at least make it look good");

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: 10,357
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: 656
I think hk_mp5kpdw's post is also wrong then.
__________________
HOPE YOU UNDERSTAND.......

for( ; ; )
printf("If you can't make it good, at least make it look good");

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: 10,357
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: 656
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.......

for( ; ; )
printf("If you can't make it good, at least make it look good");

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: 300
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: 10,357
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 04:14 AM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0 RC2

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