关于printf应该注意的两个问题

3394阅读 4评论2011-11-29 jonas_mao
分类:C/C++

  1. #include <stdio.h>
  2. #include <memory.h>
  3. #include <stdlib.h>

  4. char * static_Value (char *v, char x)
  5. {
  6.   if (!v)
  7.     return NULL;
  8.     
  9.   v[0] = x;
  10.   
  11.   return v;
  12. }

  13. int main (void)
  14. {
  15.   int i;
  16.   char x;
  17.   char y;
  18.   char *values;
  19.   
  20.   values = (char *)malloc(10);
  21.   memset (values, 0, 10);
  22.   
  23.   i = 0;
  24.   printf ("\n %d - %d", i++, i++);
  25.   
  26.   x = 'a';
  27.   y = 'b';
  28.   
  29.   printf ("\n %s - %s", static_Value(values, x), static_Value(values, y));
  30.   printf ("\n %s - %s", static_Value(values, y), static_Value(values, x));
  31.   
  32.   if (values)
  33.     free(values);
  34.     
  35.   return 0;
  36. }

运行结果:(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的最终值。

上一篇:关于 volatile 关键字
下一篇:C99标准学习笔记(3)——操作符&和[]

文章评论