鱼C论坛

 找回密码
 立即注册
查看: 1173|回复: 4

[已解决]求教

[复制链接]
发表于 2020-10-29 00:00:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求教
最佳答案
2020-10-29 10:56:21
本帖最后由 sunrise085 于 2020-10-29 11:25 编辑


不要纠结这个了。这个问题本身其实就有问题。了解++i和i++的一些区别即可,不要深究这个本身就有问题的问题了。
这个其实两个都对。只是编译器不一样而已。
书上的这个结果应该是早些年的VC6.0或者TC编译器运行的结果。
      (i++)+(i++)+(i++)整个表达式的运算都在i自加之前完成,所以得到的结果是5+5+5=15,然后在对i进行三次自加。
      (++j)+(++j)+(++j)整个表达式在j自加完成之后运算,所以j先自加3次,得到8,然后在进行求和,得到8+8+8=24


而现在的大部分编译器不这么认为。
       (i++)+(i++)+(i++),自加和求和都是逐步进行的,多项求和从左向右逐步求和,所以先计算(i++)+(i++),第一个括号内是i++,所以先取值,再自加,然后第二个内是i++,所以也是先取值,再自加,这样得到的是5+6=11,i自加了两次为7,然后在和最后一部分求和11+(i++),依然是先取值再自加,得到的是11+7=18,i自加为8
      (++j)+(++j)+(++j),同样是逐步求和,只不过是先自加再求和,计算(++j)+(++j),先对j进行两次自加得到j=7,然后求和,7+7=14,再计算下一步求和14+(++j),依然是先自加再求和,j自加为8,求和14+8=22

若真要再深究的话,i++有临时变量产生,参与运算的是临时变量,因此这个表达式不能作为左值出现,运行效率低一些;++i是对自身的操作,可以作为左值出现,没有中间临时变量,运行效率高一些。

自己编程尽量不要用一个表达式中连续自加的情况,在不同的编译器下回出现各种问题。一般在一个表达式中一个变量只有一次自加,不易出错,++在前先自加,++在后先用值。
如今新的编程语言中怕出现这个问题,根本没有自加运算符了,例如python中就没有自加运算符

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-29 00:01:38 | 显示全部楼层
#include <stdio.h>
main()
{
     int i=5,j=5,p,q;
     p=(i++)+(i++)+(i++);
     q=(++j)+(++j)+(++j);
     printf("%d,%d,%d,%d",p,q,i,j);
}     
为什么书上是15,24,8,8
DEV打印出来是18,22,8,8
为什么不一样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 01:25:59 | 显示全部楼层
gcc 打印出来也是 18 22 8 8
别怀疑,你是对的,书上有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 10:56:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-10-29 11:25 编辑


不要纠结这个了。这个问题本身其实就有问题。了解++i和i++的一些区别即可,不要深究这个本身就有问题的问题了。
这个其实两个都对。只是编译器不一样而已。
书上的这个结果应该是早些年的VC6.0或者TC编译器运行的结果。
      (i++)+(i++)+(i++)整个表达式的运算都在i自加之前完成,所以得到的结果是5+5+5=15,然后在对i进行三次自加。
      (++j)+(++j)+(++j)整个表达式在j自加完成之后运算,所以j先自加3次,得到8,然后在进行求和,得到8+8+8=24


而现在的大部分编译器不这么认为。
       (i++)+(i++)+(i++),自加和求和都是逐步进行的,多项求和从左向右逐步求和,所以先计算(i++)+(i++),第一个括号内是i++,所以先取值,再自加,然后第二个内是i++,所以也是先取值,再自加,这样得到的是5+6=11,i自加了两次为7,然后在和最后一部分求和11+(i++),依然是先取值再自加,得到的是11+7=18,i自加为8
      (++j)+(++j)+(++j),同样是逐步求和,只不过是先自加再求和,计算(++j)+(++j),先对j进行两次自加得到j=7,然后求和,7+7=14,再计算下一步求和14+(++j),依然是先自加再求和,j自加为8,求和14+8=22

若真要再深究的话,i++有临时变量产生,参与运算的是临时变量,因此这个表达式不能作为左值出现,运行效率低一些;++i是对自身的操作,可以作为左值出现,没有中间临时变量,运行效率高一些。

自己编程尽量不要用一个表达式中连续自加的情况,在不同的编译器下回出现各种问题。一般在一个表达式中一个变量只有一次自加,不易出错,++在前先自加,++在后先用值。
如今新的编程语言中怕出现这个问题,根本没有自加运算符了,例如python中就没有自加运算符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 11:33:25 | 显示全部楼层
不要再研究这个问题了,这个问题自身就有问题

而且,这种语句,以后也基本上不会用得着的,研究它属于浪费生命
只要知道 是自增就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 13:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表