Value, value, who's got the value?
Tim Olson
tim at crackle.amd.com
Fri Apr 28 02:34:43 AEST 1989
In article <1044 at itivax.iti.org> scs at 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;
The OS doesn't cause the difference -- the compiler does. Since func1
and func2 have no return statements, the value returned is whatever last
happend to be placed in the return-value location. On your UNIX-PC, this
is probably the same register as the first "temp" register that gets
assigned during expression evaluation. On the BSD machine, it isn't.
| why does
| System V get it 'right' (even tho the code is wrong);
The compilers on that machine under that OS just happened to do what you
thought should happen. The code is wrong, because there are no explicit
return statements.
| why do
| none of these flag func2 as having a syntax error?
Because it isn't a syntax error -- it is a legal (although useless)
expression. Remember that in C, assignments aren't statements -- they
are expressions.
Here is what our local C compiler had to say about your program:
w "t.c",L1/C9: func1: Function has no return statement.
w "t.c",L12/C9: c: Expression has no side-effects.
w "t.c",L8/C9: func2: Function has no return statement.
w "t.c",L18/C9: printf: Function called but not defined.
-- Tim Olson
Advanced Micro Devices
(tim at amd.com)
More information about the Comp.lang.c
mailing list