一道C面试题

2640阅读 0评论2011-06-03 zhangliangfnst
分类:C/C++

有一整数数组:
  1. int arr[] = {6,7,8,9,10}
  2.       int *ptr = arr;
  3.       (*ptr++) = (*ptr++)+123;
  4.       printf("*ptr:%d *ptr++:%d\n",*ptr,*ptr++);
程序的输出 ?
自己想一下看看心里想的输出结果,和答案是否一致。
 
答案是:*ptr:9 *ptr++:8
 
如果上述蓝色字体的语句换成
      (*ptr++) += 123;
      printf("*ptr:%d *ptr++:%d\n",*ptr,*ptr++);
程序的输出?
答案是:*ptr:8 *ptr++:7
 
  1. (*ptr++) = (*ptr++)+123;====>*ptr = *ptr + 123;
  2.                              ptr++;
  3.                              ptr++;
这条语句执行完之后arr[]={129,7,8,9,10} ptr指向整数8;;;;;;
  1. (*ptr++) += 123; ====>*ptr += 123;
  2.                       ptr++;
 
这条语句执行完之后arr[]={129,7,8,9,10} ptr指向 整数7;;;;;;
 
然后printf函数还有一点小玄机。对于call convention(调用惯例)为stdcall而言,函数的压栈顺序为从右到左一次压栈,然而由call指令再将返回地址压入栈中。
因此在这里将*ptr++压入栈的同时,将指向ptr向前移动了一个位置,指向了下一个整数。
 
上一篇:以太网相关
下一篇:Makefile~