Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!cs.utexas.edu!uunet!mcvax!ukc!icdoc!qmc-cs!jeremyr From: jeremyr@cs.qmc.ac.uk (Jeremy Roussak) Newsgroups: comp.lang.c Subject: Re: Value, value, who's got the value? Message-ID: <958@sequent.cs.qmc.ac.uk> Date: 28 Apr 89 22:20:04 GMT References: <1044@itivax.iti.org> Reply-To: jeremyr@cs.qmc.ac.uk (Jeremy Roussak) Organization: Computer Science Dept, Queen Mary College, University of London, UK. Lines: 64 In article <1044@itivax.iti.org> scs@vax3.iti.org (Steve Simmons) writes: > >Consider the following program: > >int func1() >{ > int b ; > > b = 2 ; >} > >int func2() >{ > int c = 3 ; > > c ; >} > >main() >{ > int a = 1 ; > printf( "Value of a is %d\n", a ) ; > a = func1() ; > printf( "Value of a is %d\n", a ) ; > a = func2() ; > printf( "Value of a is %d\n", a ) ; >} > >Compile and run this on a UNIX-PC (system V) under standard cc or >with gcc, and the result is: > Value of a is 1 > Value of a is 2 > Value of a is 3 > >On BSD43. with standard cc or gcc, the result is > Value of a is 1 > Value of a is 0 > Value of a is 0 > >Several questions: why does the OS make a difference; why does >System V get it 'right' (even tho the code is wrong); why do >none of these flag func2 as having a syntax error? To answer your questions in reverse order, no syntax error is flagged because there is no syntax error. A statement in C is simply an expression. The statement a+3; is perfectly legal: the compiler will add 3 to a and blissfully throw the result away. Think of the "statement" i++; It's not so much the OS that makes the difference as the way the compiler generates code. If it leaves values used in assignments lying around in a place where they might be interpreted later as results from a function, and your function carelessly doesn't define a return value, you'll get a spurious return value. In your case, this is the value you want but haven't written the code to get. To choose a silly example, some 68000 C compilers use d0 to return function results. If an assignment a=3 generated code like move #3,d0 move d0,a (not that it would, one hopes!) then the value 3 would be lying around in d0 at return time. Simple, eh? Jeremy Roussak Just a part-time hacker