C语言中多个自增自减的运算规律
摘 要:C语言允许在一个表达式中使用一个以上的自增运算符、自减运算符,这种灵活性使程序简洁,但同时也会引起副作用。这种副作用主要表现在:使程序费解,并易于发生误解或错误。例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一或者干脆回避这类问题。为了弄清楚C语言中多个自增或自减运算符的运算规律,笔者经查阅大量资料并反复上机验证,总结出在VC++6.0环境下多个自增自减的运算规律。
关键词:自增;自减;运算规律
中图分类号:TP311
C语言中有两个很奇特的单目运算符:++(自增运算符)和--(自减运算符),自增运算符和自减运算符都有前缀式和后缀式。这两个运算符在C语句中,尤其是循环语句中使用较为广泛,对于单个的自增运算符或自减运算符,相信大家都易于理解。但是,C语言允许在一个表达式中使用一个以上的自增运算符、自减运算符,这种灵活性使程序简洁,但同时也会引起副作用。这种副作用主要表现在:使程序费解,并易于发生误解或错误。例如,当i=3时,表达式(i++)+(i++)+(i++)的值为多少,各种教材说法不统一或者干脆回避这类问题。既然前面提到在一个表达式中可以有多个自增或自减运算符,我们不能总是以费解或避免出错为由来回避这个问题,不用归不用,了解一下这些内容还是相当有必要的。为了弄清楚C语言中多个自增或自减运算符的运算规律,笔者经查阅大量资料并反复上机验证,总结出在VC++6.0环境下多个自增自减的运算规律。
1 连续多个后缀的运算规律
先统一取值后依次自增或自减。如:
#include
void main()
{
int a,i=5;
a=(i++)+(i++)+(i++);
printf(“a=%d,i=%d\n”,a,i);
}
其运算规律是先对所有的i++统一取值5,然后i依次自增3次,即 a=5+5+5=15,i=5+1+1+1=8。
因此,程序输出结果为:a=15,i=8
2 连续多个前缀的运算规律
前两个连续的前缀(两个连续自增,或者两个连续自减,或者一个自增一个自减),即依次自增(减)后,统一取第二个自增(减)的值,后面的每个自增(减)后即刻取值。如:
#include
void main()
{
int a, i=5;
a= (++i)+(++i)+(++i);
printf(“a=%d,i=%d\n”,a,i);
}
第一个++i的值为6,第二个++i的值为7,第三个++i的值为8,但第一个++i和第二个++i统一取第二个++i的值7,即 a=7+7+8=22,而i的值则依次自增,即i=5+1+1+1=8。
因此,程序输出结果为:a=22,i=8
同理,我们再看一个稍复杂的例子:
#include
void main()
{
int a,i=5;
a=(--i)+(++i)+(++i)+(--i);
printf(“a=%d,i=%d\n”,a,i);
}
其运算过程为:a=5+5+6+5=21,i=5-1+1+1-1=5。
因此,程序输出结果为:a=21,i=5
当然,多个自增自减之间的其它算术运算也适用此规律。如:
#include
void main()
{
int a,i=5;
a=(++i)*(- -i);
printf(“a=%d,i=%d\n”,a,i);
}
其运算过程为:a=5*5=25,i=5+1-1=5。因此,程序输出结果为:a=25,i=5
3 前后缀混合的情况
3.1 一般情况:表达式中自左向右计算,函数参数列表中自右向左运算。前缀自增(减)后取值;后缀(或变量)取值依其所处位置而定,有连续多个将统一取值,其自增(减)在语句结束前进行。如:
#include
void main()
{
int a,i=5;
a=(++i)+(++i)+(i++)+(i++)+(++i);
printf(“a=%d,i=%d\n”,a,i);
}
其运算过程为:a=7+7+7+7+8=36,i=5+1+1+1+1+1=10。因此,程序输出结果为:a=36,i=10
3.2 前后缀各有一个的情况:如:
#include
void main()
{
int a, i=5;
a=(i++)*(++i);
printf(“a=%d,i=%d\n”,a,i);
}
由于(i++)*(++i)应满足交换率与(++i)*(i++)相同,规定按后者计算,即先计算前缀再计算后缀,故a=6*6=36,i=5+1+1=7。因此,程序输出结果为:a=36,i=7
当自增(减)出现在函数表达式的参数列表中,它的计算方法与作为普通语句的运算结果是完全不同的。因此如果函数有多个参数,则参数自右向左计算,如: