C语言中多个自增自减的运算规律-文档资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中多个自增自减的运算规律
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
当自增(减)出现在函数表达式的参数列表中,它的计算方法与作为普通语句的运算结果是完全不同的。
因此如果函数有多个参数,则参数自右向左计算,如:#include void main()
{
int i=5;
printf("%d,%d\n", --i, i++*++i );
}
其运算过程为:先计算i++*++i为36,再计算- -i结果为5。
因此,程序输出结果为5,36
3.3 有多个前后缀的情况:++i有两个以上在一起时最左边的连续自增同上述规律二、,其余每个自增后取值,如:#include
void main()
{
int i=5;
printf("%d\n",(++i)+(i++)+(i++)+(++i));
}
计算过程为6+6+6+7=25,因此,程序输出结果为25
再例如:
#include
void main()
{
int i=5;
printf("%d\n",(++i)+(++i)+(++i)+(++i)+(i++));
}
计算过程为7+7+8+9+9=40,因此,程序输出结果为40
再例如:
#include
void main()
{
int i=5;
printf("%d\n",(++i)+(++i)+(++i)+i+(++i)+(++i));
}
计算过程为7+7+8+8+9+10=49,因此,程序输出结果为49
3.4 函数参数中有括号时,括号参数优先计算,其余参数仍自右向左计算,如:
#include
void main()
{
int i=9,j=8;
printf("%d, %d\n",(++i, j--), ++i);
}
其运算过程为先计算(++i,j--),再计算++i,因此,程序输出结果为8,11
再例如:
#include
void main()
{
int i=9,j=8;
printf("%d, %d ,%d\n",(++i, j--), ++i, i);
}
注意其运算过程是先计算括号中的值,然后在++i ,i这两个参数中,自右向左计算,即先计算i,再计算++i ,因此,程序输出结果为8,11,10。
3.5 最后i的值等于原值加总自增次数减总自减的次数。
以上规律是在VC++6.0环境下测试总结出来的,在不同的运行环境下规律可能不一样,需区别对待。
当然,此规律只供探究C语言中多个自增、自减的运算规律,在实际编程中还是应该尽量避免或禁止在一个语句中使用多个自增或自减的这种写法。