首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言i+、+i混合运算老手未必全掌握,看了你就明白了

请看下文

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

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=%d\n",i,j);

i=3;

k = (++i)+(++i)+(++i);

printf("i=%d,k=%d\n",i,k);

i=3;

l = (++i)+(++i)+(i++);

printf("i=%d,l=%d\n",i,l);

i=3;

m = (i++)+(++i)+(++i);

printf("i=%d,m=%d\n",i,m);

i=3;

n=(i++)*(++i)*(++i);

printf("i=%d,n=%d\n",i,n);

i=3;

t=(++i)*(++i)*(i++);

printf("i=%d,t=%d\n",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,完成计算。其它表达式计算机理相同,请读者验证。

三、总结

学编程语言要细心,多编程,多看例程,会逐步提高。

如果你觉得本文有帮助,请关注我,并点赞。有疑问或其它要探讨的问题,请留言,感谢!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200114A0DX8X00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券