C语言中的自增自减运算符(i++、i--、++i、--i)对于新手来说,通常感到困惑,说来容易算来难,如果涉及到混合运算,更是无法理解。甚至有些学了几年的老手,未必全掌握(也许你忽略了这个问题,笔者相信你的能力)。本文以自增运算符为例(自减运算符机理相同),为读者解惑。一、先谈谈你可能已经掌握的
1、自增运算符不适用于常量或表达式。如果你试图写出诸如2++、(5+6)++、(i+j)++等语句在编译时均会出现错误提示,无法通过编译。2、自增运算符仅适用于变量,如i++、++i等是没有问题的。对于其运算机理,相信对于很多老手都很清楚了。对于新手而言,值得一提,它们最终结果均是实现i=i+1这种计算,但计算顺序是有不同的。记住一点,i++是先取i的值之后再自加;而++i则是先让i自加,再取其值。二、再谈谈你可能困惑的
如果i++、++i参与混合运算,你真的清楚吗?请看下面的例子,你能回答j、k、l、m、n、t的输出值是多少吗?1、例子:
#include <stdio.h>
int main()
{
int i = 3,j=0,k=0,m=0,n=0,t=0,l=0;
j = (i++)+(i++)+(i++);
printf("i=%d,j=%dn",i,j);
i=3;
k = (++i)+(++i)+(++i);
printf("i=%d,k=%dn",i,k);
i=3;
l = (++i)+(++i)+(i++);
printf("i=%d,l=%dn",i,l);
i=3;
m = (i++)+(++i)+(++i);
printf("i=%d,m=%dn",i,m);
i=3;
n=(i++)*(++i)*(++i);
printf("i=%d,n=%dn",i,n);
i=3;
t=(++i)*(++i)*(i++);
printf("i=%d,t=%dn",i,t);
return 0;
}
有些读者可能会说,这还不简单,那就按照上面你讲的i++是先取i的值之后再自加;而++i则是先让i自加,再取其值,这样按照优先级逐步计算就是了,于是就得出以下答案:j=12,k=15,l=14,m=12,n=60,t=100。如果你这样想又错了。以VC++6.0开发环境为例(不同开发环境由于编译原理不同可能会有差异,读者一定要注意),其运行结果为j=9,k=16,l=15,m=13,n=80,t=125,如下图所示。
程序运行结果2、例程分析
有些读者可能对此结果非常不解,尤其是l和m的操作数只是顺序不同,值为何不一样了。下面我们来分析一下运算机理。在VC++6.0中,表达式按优先级运算前对操作数++i先自增1,而且长表达式是分步计算的,对表达式中还未参与运算的所有操作数i均有影响(已经计算的i不受影响),一边计算一遍确定操作数i的值,整个表达式计算完成后再对i++实现自增。如l的计算,先计算前两项使得两个++i总共自增了两次即i=5,该步计算相当于5+5=10;第二步计算10+(i++),这时取i的值为5参与运算得结果15,最后i++项自增1,使i变为6,完成计算。再比如m的计算,先计算前两项,仅有一个++i,自增1得i=4,即实现4+4=8;第二步计算8+(++i),i自增1得i=5,于是得到结果m=8+5=13,最后i++项自增1,使i变为6,完成计算。其它表达式计算机理相同,请读者验证。三、总结
学编程语言要细心,多编程,多看例程,会逐步提高。
我是“Coc编程”如果你觉得本文有帮助,请关注我,并点赞。有疑问或其它要探讨的问题,请留言,感谢!