首先,我们选择的平台是Vc6.0,如果使用vs2005就没必要讨论这个问题了。
例1 、#include
void main()
{
int i=0;
printf("%d %d %d",++i,++i,++i);
}
输出为3 2 1
原因是,如果一个函数有多个参数,比如
int fun (int a, int b, int c);
调用时,总是从最后一个参数开始压栈。 也就是c先进栈,其次是b,最后才是a。因此
先计算最后一个参数(即最右一个++i),压入1,以此类推,再压入2,3和字符串"%d,%d,%d"的首地址。
所以 , 程序的输出是 3,2,1
可是
#include
void main()
{
int i=0;
printf("%d %d %d",i++,i++,i++);
}
的输出?
我用VC结果是0 0 0,而不是是2 1 0
例2、
#include
#include
#define F(x) (x+x+x)
main()
{
int i=2;
printf("%d\t%d",i,F((i++)));
printf("\t%d\n",i);
}
答案:2 6 5
解释:其中f((i++))表示的是i++ + i++ + i++ 因为先求i相加,再i++,因此答案比较好解释,然而下面一题:
例3、
#include
#include
#define F(x) (x+x+x)
main()
{
int i=2;
printf("%d\t%d",i,F((++i)));
printf("\t%d\n",i);
}
答案:5 13 5
解释:其中f((i++))表示的是++i + ++i + ++i,因为c是从右向左计算机,就表示成了{++i + (++i + ++i)},首先计算机小括号内,最后一个++i表示此时i的值为3,中间再以3为基值,++i 的值就为4,由于i是变量,小括号为表示此时i的值相加4+4为8,再与前面一个++i相加,即5+8=13
注:只是函数,printf从右向左,等式是从左向右,别搞混淆了!
注:此文具有代表性,仔细一下,能让人豁然开朗。
阅读(2331) | 评论(1) | 转发(0) |