i++与++i 误区
时间:2010-09-02 来源:hecangbo
首先,我们选择的平台是Vc6.0,如果使用vs2005就没必要讨论这个问题了。
例1 、#include<stdio.h>
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<stdio.h>
void main()
{
int i=0;
printf("%d %d %d",i++,i++,i++);
}
的输出?
我用VC结果是0 0 0,而不是是2 1 0 例2、 #include <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
#include <stdlib.h>
#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从右向左,等式是从左向右,别搞混淆了! 注:此文具有代表性,仔细一下,能让人豁然开朗。
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<stdio.h>
void main()
{
int i=0;
printf("%d %d %d",i++,i++,i++);
}
的输出?
我用VC结果是0 0 0,而不是是2 1 0 例2、 #include <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
#include <stdlib.h>
#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从右向左,等式是从左向右,别搞混淆了! 注:此文具有代表性,仔细一下,能让人豁然开朗。
相关阅读 更多 +