stack quirk?
brian_helterline
brianh at hpcvia.CV.HP.COM
Sat Jul 28 00:54:26 AEST 1990
>Hi everyone. Here's one. I hope it is not as simple as my last one,
>you remember( gets() ). I'm running the following program, and I'm not
>getting out what I think I should be( so what else is new!). Any ideas?
>#include <stdio.h>
>main()
>{
>int i= 0;
>printf("\n%d %d\n", ++i, ++i); /* output is: 2 1, I expected 1 2 */
>i= 0;
>printf("%d %d\n", ++i, i++); /* output is: 2 0, I expected 1 1 */
>i= 0;
>printf("%d %d\n", i++, ++i); /* output is: 1 1, I expected 0 2 */
>i= 0;
>printf("%d %d\n", i++, i++); /* output is: 1 0, I expected 0 1 */
>}
>
>Please send e-mail: ndimas at pikes.denver.colorado.edu
>
>
> Thank You
> Nicholas Dimas
>----------
The output you got should is correct. The arguments to
printf() [or any function] are pushed on to the stack
right to left so they are in the correct order for
printf() to pop them off when needed. If you evaluate
each expression above right-to-left, you will "expect"
exactly what the output was. Also note that each argument
to printf() is a single expression, so once it is evaluated,
the ++ operator can do the increment and then move on to the
next expression. As an example, printf( "%d %d\n", i++, ++i );
arg1 = "%d %d\n"
arg2 = i++;
arg3 = ++i;
if i=0 to start, and we evaluate right-to-left,
arg3 = 1 and i = 1
arg2 = 1 and _then i = 2
arg1 = "%d %d\n";
I am not certain as to what ANSI specifies about whether this
behavior is correct or not. I am just trying to describe
what is happening. It is usually a bad idea to use ++ operators
on the same variable more than once in _ANY_ expression.
Hope this helps,
More information about the Comp.lang.c
mailing list