- #include <stdio.h>
- #include <memory.h>
- #include <stdlib.h>
- char * static_Value (char *v, char x)
- {
- if (!v)
- return NULL;
-
- v[0] = x;
-
- return v;
- }
- int main (void)
- {
- int i;
- char x;
- char y;
- char *values;
-
- values = (char *)malloc(10);
- memset (values, 0, 10);
-
- i = 0;
- printf ("\n %d - %d", i++, i++);
-
- x = 'a';
- y = 'b';
-
- printf ("\n %s - %s", static_Value(values, x), static_Value(values, y));
- printf ("\n %s - %s", static_Value(values, y), static_Value(values, x));
-
- if (values)
- free(values);
-
- return 0;
- }
运行结果:(cygwin)
这里的运行结果告诉了我们printf的特点:
printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的。
所以第一个printf就可以看出先把参数依次入栈,最后在处理的时候是反过来的,即真正的执行顺序是从右到左的。此时先执行第二个i++;打印的值为0,然后i自增变为1,所以第一个i就自然的成为了1.打印出1 和 0。
相比较第一个,我们可以看到第一个是对值进行操作。第二个是则是对指针进行操作。根据printf的特点,当从右向左执行过程中,先执行static_Value(values, y) 此时values[0] = y; 然后执行 static_Value(values, x)此时values[0] = x; 这时因为并不是对值进行操作,而是指针,而且将要打印的指针的地址是一样的,都是values申请的内存地址,所以此时 打印出来的就都是最后一个执行的x了,因为最后一个执行的时候对这个地址空间进行的赋值是values的最终值。