(i++) + (++i) + (i++) 与 (i++) + (i++) + (++i) + (i++)问题

xiongxiao 2008-11-10 03:05:58
int a,b,i;
i = 0;
a = (i++) + (++i) + (i++);
i = 0;
b = (i++) + (i++) + (++i) + (i++)
请哪位指点一下这其中的不同,执行结果是相当诡异的,a是3,b是2,而且在B这个算式的基础上,不管在最前面加多少个i++,结果就都是2了,
另外还请说明一下,(++i) + (++i) = 4,而为啥 (++i) +(++i) +(++i) = 7呢?
...全文
303 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
a5418ccc 2011-09-19
  • 打赏
  • 举报
回复
有收获
conghua19 2011-07-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiongxiao 的回复:]

不要动不动就说编译器有关,我还不知道呀,现在的问题是我所用的一些编译器都是编译出这种结果,我想知道的是为什么会编译出这种结果来,执行过程是怎样的,分别在VC与LINUX下的编译,运行结果一样仔细看清楚题目,后面三个((i++) + (++i) + (i++) )都是一样的,就只是在这前面加上(i++),为什么结果就不一样了,看了上面汇编,还是有推不出编译成这样的思路

更加BS那些不懂装懂的……
[/Quote]

说得好.,,有些人就总是自以为是..
天蛾糊 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 lyntion 的回复:]
引用 39 楼 xiongxiao 的回复:
引用 30 楼 jia_xiaoxin 的回复:
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已……
[/Quote]
就是这样的!顶!
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 xiongxiao 的回复:]
引用 30 楼 jia_xiaoxin 的回复:
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++)……
[/Quote]


#include<iostream>
using namespace std;
void main()
{

int a,b,c,d,i;
//两个操作数的情况

i = 0;
a = (i++) + (++i) ;//2
i = 0;
b = (++i) + (i++) ;//2
i=0;
c=(++i) + (++i);//4
i=0;
d=(i++) + (i++);//0
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl<<endl;

//三个操作数的情况
i = 0;
a = (i++) + (++i) + (++i);//4
i = 0;
b = (++i) + (i++) +(++i);//4
i=0;
c=(++i) + (++i) + (i++);//6
i=0;
d=(++i) + (++i) + (++i);//7
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl<<endl;

//三个以上操作数的情况
i = 0;
a = (i++) + (++i) + (++i)+(++i);//7
i = 0;
b = (++i) + (i++) +(++i)+(i++);//6
i=0;
c=(++i) + (++i) + (++i)+(i++);//10
i=0;
d=(++i) + (++i) + (++i)+ (++i);//11
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl<<endl;

i=0;
int sum=(i++)+(++i)+(++i)+(++i)+(i++)+(i++)+(++i);//17
cout<<sum<<endl;

}


/*
上述全部代码都在VC++6.0环境下编译通过,其他C++编译器,未曾调试,
JAVA编译器就不适用了,JAVA运算顺序有所不同。

总结,=右边的表达式都是从左到右进行运算的,按二目运算进行运算,
即每两个操作数进行运算返回一个结果,
才进行后面的运算。
当操作数少于等于三个,则有以下规则,按二目运算,将两操作数进行划分,i初始为0
(++i)+(++i),i加了两次,即此时i变为2,返回运算结果2+2
(i++)+(++i)或(++i)+(i++),i只加了一次,即此时i变为1,返回运算结果1+1

当操作数大于三个,从四个开始,规则有变化
(++i)+(++i),i加了两次,即此时i变为2,返回运算结果2+3 //感觉不是二目运算
(i++)+(++i),i加了一次,在后操作数才开始加的,所以此时i变1,返回运算结果0+1 //后操作数返回后,i才++
(++i)+(i++),i加了一次,在前操作数就开始加了,所以此时i变为1,返回运算价格1+1 //前操作数返回后,i才++

*/
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 xiongxiao 的回复:]
引用 30 楼 jia_xiaoxin 的回复:
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++)……
[/Quote]

楼主,还是有问题咧,如四个++i相加
i=0;
a = (++i)+(++i)+(++i)+(++i);
后两个i做二目运算,返回4,此时i为2,继续,前两个i做二目运算,返回8,此时i 为4,最后a=8+4=12,可VC6.0运行结果是11,
五个i相加
a = (++i)+(++i)+(++i)+(++i)+(++i);
a=5+8+4=17;,运行结果是16,

怎么按二目运算来算也不对啊

  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jia_xiaoxin 的回复:]
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++) + (i++) + (++i) + (i++) ……
[/Quote]

恩,顶30楼,正解,我也为这问题纠结
w147456 2008-11-12
  • 打赏
  • 举报
回复
up
wzfxyer 2008-11-12
  • 打赏
  • 举报
回复
难道这就是所谓的经典,看了半天才刚有点门道。
taodm 2008-11-11
  • 打赏
  • 举报
回复
哎,就算你真的懂了吧。等你再多用过几个编译器后,还会更懂一点的。
xiongxiao 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jia_xiaoxin 的回复:]
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++) + (i++) + (++i) + (i++)
先分成独立的两组后一组的结果同上为2.
第一组都是先返回后加,所以为0,总和就为2.


[/Quote]

终于见在正确的解释了,谢谢,学习
不知那些总是说和编译器有关的老兄是否也脸红一下啊,我也是,开始也以为总有一个编译器不是这样编译的,看完jia_xiaoxin 的回复,才知道这就是C++的特性,只是平时大家都忽略了这两个关键字“二目运算”,“从右至左”,其实一般的入门书上都有说,可就是和这问题联系不起来,强汗一把;
另外再说两句,存在即是合理,既然C++提供了这么强大的灵活性,自然有它的道理,我们应该努力学习并去发现它的使用方法与好处,而不是一味的避免出现这样看不明白的问题。谢谢大家,加分结贴。
wzfxyer 2008-11-10
  • 打赏
  • 举报
回复
电脑执行速度太快了,建议用386试一下,可能就与我们想的差不多了。那没加完这已经加完了。
wzfxyer 2008-11-10
  • 打赏
  • 举报
回复
电脑所选速度太快了,建议用386试一下,可能就与我们想的差不多了。
dzc8866 2008-11-10
  • 打赏
  • 举报
回复
请教一下,看反汇编有什么工具?
xuetangxiaoqing 2008-11-10
  • 打赏
  • 举报
回复
真的很无聊啊,VC++和c中,
a=++i;
可理解为:
{
i=i+1;
a=i;
}

而a=i++;
为:
{
a=i;
i=i+1;
}
hackers007 2008-11-10
  • 打赏
  • 举报
回复
不清楚,不过谈下个人观点,与编译器有关或者其他原因我也搞不清楚,但我支持去跟踪看汇编代码,基本上就可以明确的知道是什么原因导致的。
问题很深奥!!呵呵。楼主专研精神值得我学习
tsoslience 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jia_xiaoxin 的回复:]
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++) + (i++) + (++i) + (i++)
先分成独立的两组后一组的结果同上为2.
第一组都是先返回后加,所以为0,总和就为2.


[/Quote]
lzp765 2008-11-10
  • 打赏
  • 举报
回复
专牛角尖吧............
jeff_nie 2008-11-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 VBSpine 的回复:]
来人,上板砖。。。。。。。。。。。。
[/Quote]
.
jia_xiaoxin 2008-11-10
  • 打赏
  • 举报
回复
C++是二目运算,也就是说每次只能有两项参加运算。如果是多项时,每两项一组会分成多组。
而且C++的计算顺序是从右向左的。

a = (i++) + (++i) + (i++);
先计算后面两项 ++i先让i自加1变为1再返回1,i++返回的i此时为1.所以两项之和为2。
第一项中此时i已经为1,所以总和为3。

b = (i++) + (i++) + (++i) + (i++)
先分成独立的两组后一组的结果同上为2.
第一组都是先返回后加,所以为0,总和就为2.


(++i) + (++i) = 4
是因为两项同时参与运算,相当于自加了两次,所以都返回2结果就为4.

(++i) +(++i) +(++i) = 7
是因为后两项结果为4,此时i为2.第一项返回为3,总结果为7.
BaihowFF 2008-11-10
  • 打赏
  • 举报
回复
建议楼主不要挑战编译器了...
加载更多回复(28)
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充值模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充值模块:用户可以通过添加银行卡再为自己进行充值操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  
技术的变革,一定是思想先行,云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,Cloud+Native。Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。云原生概括为4个要点:DevOps+持续交付+微服务+容器。符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。要转向云原生应用需要以新的云原生方法开展工作,云原生包括很多方面:基础架构服务、虚拟化、容器化、容器编排、微服务。本课程凝聚老师多年经验,基于真实工业界电商业务讲解,涉及多种技术落地方案,涉及多语言的协调开发,让学员在实战中熟悉云原生开发的全流程,感受云原生带来的开发便利。目前对云原生的人才需求也非常的大,谁尽早掌握,谁就能抓住这个风口,实现收入的增长。 本课程将分为3个阶段: 第一阶段:会基于云原生实现电商系统的大部分核心服务,包括:用户服务,商品服务,商品类目服务,商品属性服务,品牌服务,订单服务,网关服务等等。 第二阶段:基于云原生完成整个项目的持续集成,持续交付、持续部署,完成整个项目的自动化上云等等。  第三阶段: 进一步完善和优化电商系统,加入大数据,智能AI等等。  本课程包含的技术: IDEA集成开发工具 SpringBootSpringCloud SpringCloud AlibabaDevops MavenJenkinsCI/CD 持续集成 持续交付GitDocker Kubertenes 分布式系统微服务注册中心与配置中心:Nacos分布式系统微服务流量防卫兵:Sentinel分布式系统微服务网关:Gateway分布式系统微服务负载均衡:Feign分布式系统微服务链路追踪:Sleuth,Zipkin分布式系统微服务端点监控:spring boot adminSpringSecurity和JWT(认证和授权)消息中间件解决方案(RabbitMQ)MySQL(数据库)  MyCat MySQL分布式集群解决方案 Lucene、Elasticsearch(搜索) Nginx(web服务器)多语言(Go语言 Python语言 Java语言)CORS实现跨域 Swagger2 文档生成工具 Quartz分布式任务调度 Zookeeper Ehcache Restful VUE+jQuery+Ajax+NodeJS VUE+Element-UIGo+Gin 、 TensorFlow、RNN 、LSTM、Django、Spark大数据相关技术等等 课程亮点: 1.与企业无缝对接、工业界真实业务场景 2.集后端+前台+测试+运维一体,全面掌握技术链 3.多语言Java+Go+Python协调开发,属于语言应用场景4.支持项目快速迭代和开发 5.使用微服务技术栈+前后端分离构建项目 6.云上的开发体系,打造新一代研发平台7.引入全新的设计理念  8.集成SpringCloud Alibaba实现统一整合方案 9 Kubernetes+Docker容器化部署和管理 10 Devops全自动化持续集成和持续交付、部署11.TensorFlow、RNN 、LSTM综合应用12.动态扩展,弹性自动伸缩13.高并发下的服务降级、限流实战 14.实现高并发请求和实现高可用架构解决方案 15.引入大数据技术16.引入人工智能技术17.全程代码实操,提供课程代码和资料
一、prometheus简介 Prometheus是一个开源的系统监控和告警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF维护管理的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,prometheus支持多种exporter采集数据,还支持通过pushgateway进行数据上报,Prometheus再性能上可支撑上万台规模的集群。 二、prometheus架构图 三、prometheus组件介绍 1.Prometheus Server: 用于收集和存储时间序列数据。 2.Client Library: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。 3.Exporters: prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端 4.Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。 5.Grafana:监控仪表盘 6.pushgateway: 各个目标主机可上报数据到pushgatewy,然后prometheus server统一从pushgateway拉取数据。 四、课程亮点 五、效果图展示 六、讲师简介 先超(lucky):高级运维工程师、资深DevOps工程师,在互联网上市公司拥有多年一线运维经验,主导过亿级pv项目的架构设计和运维工作 主要研究方向: 1.云计算方向:容器 (kubernetes、docker),虚拟化(kvm、Vmware vSphere),微服务(istio),PaaS(openshift),IaaS(openstack)等2.系统/运维方向:linux系统下的常用组件(nginx,tomcat,elasticsearch,zookeeper,kafka等),DevOps(Jenkins+gitlab+sonarqube+nexus+k8s),CI/CD,监控(zabbix、prometheus、falcon)等 七、课程大纲
一、为什么学习kubernetes众所周知,随着容器的快速发展,容器管理工具kubernetes也应运而生,目前不仅百度、京东、阿里、google等大公司在使用kubernetes,一些中小企业也开始把业务迁移到kubernetes,那么作为运维、开发、测试或者架构师来说,必须要掌握这项技术,才能提现我们的工作价值,才能在行业具备保持较高的技术水平,kubernetes作为成熟的容器编排工具,具有容器集群的自动化部署、自动化伸缩和故障自恢复的能力,让容器的部署和管理变得更加容易,能够给企业和提供一个智能化的容器云管理平台,为企业快速上云提供一个安全可靠的解决方案,此课程主要介绍kubernetes1.14/kubernetes1.15版本高可用集群的安装部署和使用,通过我多年工作经验总结,带你深入体验企业实战案例,让您轻松快速的掌握k8s,接下来让我们一起出发吧。 二、课程亮点 三、讲师简介 先超(lucky):高级运维工程师、资深DevOps工程师,在互联网上市公司拥有多年一线运维经验,主导过亿级pv项目的架构设计和运维工作 主要研究方向: 1.云计算方向:容器 (kubernetes、docker),虚拟化(kvm、Vmware vSphere),微服务(istio),PaaS(openshift),IaaS(openstack)等2.系统/运维方向:linux系统下的常用组件(nginx,tomcat,elasticsearch,zookeeper,kafka等),DevOps(Jenkins+gitlab+sonarqube+nexus+k8s),CI/CD,监控(zabbix、prometheus、falcon)等.

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧