自增自减运算符的前置与后置:
下面我们通过几个程序来看自增(自减也是一样)运算符:
程序1:
#include <STDIO.H>
int main()
{
int i1=5,i2=5,j1,j2;
j1=++i1;
j2=i2++;
printf("j1=%d\nj2=%d\n",j1,j2);
return 0;
}
程序运行结果:
:
自增运算符前置是先增后赋值,自增运算符后置是先赋值后增
程序2:
#include <STDIO.H>
int main()
{
int i1=5,i2=5;
printf("++i1=%d\ni2++=%d\n",++i1,i2++);
return 0;
}
程序运行结果:
自增运算符在printf函数里得到的运算结果和赋给变量的结果是一样的,两者效果相同
程序三:
#include <STDIO.H>
int main()
{
int i1,i2=0;
for (i1=1;i1<=5;i1++)
{
i2+=1;
}
printf("%d\n",i2);
i2=0;
for (i1=1;i1<=5;++i1)
{
i2+=1;
}
printf("%d\n",i2);
}
运行结果:
为什么呢?自增运算符的前置和后置形式在循环里的值竟然是一样的?
仔细想想,是因为for循环的判断条件是i1<=5,这是用i的值在判断循环是否结束!自增运算符无论放在i1的前面还是后面,i1的值都会加1,所以两个循环最后得到的i2值相同
但是,我们如果用表达式的值判断循环是否结束,结果又不一样!
程序4:
#include <STDIO.H>
int main()
{ int j,i1,i2=0;
for (i1=1;j<=5;j=i1++)
{
i2+=1;
}
printf("i2=%d\n",i2);
return 0;
}
运行结果:
程序5:
#include <STDIO.H>
int main()
{ int j,i1,i2=0;
for (i1=1;j<=5;j=++i1)
{
i2+=1;
}
printf("i2=%d\n",i2);
return 0;
}
运行结果:
因为程序4和程序5是在用表达式的值,也就是j的值在判断循环是否结束,所以会得到以上结果,原理和程序1 程序2是一样的。
重点:自增自减运算符的操作结果不是被他们所修改的变量,而是变量值得拷贝
i++=5;结果会是什么呢?
这样做你会得到一个错误,i++的结果是i值得拷贝,并不是一个变量,不可以向常量赋值。