昨天在群里面聊天,一同学问的问题:
以下程序:
#include<stdio.h>
int main()
{
int i=0, j=0;
printf("%d ,%d ,%d\n ",i,i++,i++);
printf("%d ,%d ,%d \n",j,++j,++j);
//
return 0;
}
可能很多人能很快的得出答案,这不挺简单的题目吗?
然而自己一运行(假设编译器为vc++ 6.0),运行结果应该是:0 0 0
2 2 1
怎么回事?
其实这就需要追究两点:1.自增自减运算符 2.printf()机制
首先,在VC++编译器中,printf(“ %d%d”,a,b)是从右向左处理函数的参数。 即先将b压入栈中,再将a压入栈中。 最后,从栈中依次读取a,b.
其次,自增自减运算符,先增运算符是在语句执行前操作,而后增运算符如a++是在语句执行后操作。
所以,语句 printf("%d ,%d ,%d\n ",i,i++,i++);在执行时,按printf栈机制和处理参数顺序理解。执行输出后,进行i++操作两次。
语句printf("%d ,%d ,%d \n",j,++j,++j); 先将第2个++j压入栈(此时j=1),再将第1个++j压入栈(此时j=2),再将第一个j压入栈(此时,j=2)。最后依次读取(221)。
可见这涉及到编程语法和编译器如何处理。
如下:
#include<stdio.h>
int main()
{
int i=0, j=0;
printf("%d ,%d ,%d\n ",i,i++,i++);
printf("此时i=%d\n ",i); // i=2
printf("%d ,%d ,%d \n",j,++j,++j);
printf("此时j=%d\n",j); //j = 2
//
return 0;
}
要想进一步学习这些,需要涉及到汇编,而不同的编译器可能具体机制不同,所以可能会产生不同结果。
最后,在实际编程中,我们要尽量避免此类现象,应该平时注意写规范、可读性好的代码。