免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3327 | 回复: 4
打印 上一主题 下一主题

[C++] 单目运算符的求值顺序/求值序列点的一个问题! 非常迷惑! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-28 10:36 |只看该作者 |倒序浏览
本帖最后由 sanday9 于 2013-08-28 10:53 编辑

我知道i++是先返回i再++
++i是自增了i再返回
因此

  1. int i=1;
  2. printf("%d\n",i++);
复制代码
打印1,而

  1. int i=1;
  2. printf("%d\n",++i);
复制代码
打印2.

但是下面的实验:

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int i=1;
  5. printf("%d\n",(i++)+(i++));//每个子表达式都先返回1,再自增。打印2,和我期待的一致
  6. i=1;
  7. printf("%d\n",(i++)+(++i));//打印4,我期待的结果是print(1+3),和期待一致
  8. i=1;
  9. printf("%d\n",(++i)+(i++));//打印4,我期待的结果是print(2+2),和期待的一致
  10. i=1;
  11. printf("%d\n",(++i)+(++i);//打印6,我期待的结果是print(2+3),和期待不一致
  12. return 0;
  13. }
复制代码
唯一的问题是,我认为(++i)+(++i)先自增i得到2,第一次返回,然后再自增i得到3,第二次返回,两次返回的结果相加=5.但是实际上打印6

我用vc2012的debug/release以及GCC4.4.6都是这样的结果。这是为什么呢?
我的理解问题在哪里?

论坛徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午马
日期:2014-10-19 13:40:31酉鸡
日期:2014-11-08 08:44:54处女座
日期:2014-11-10 17:01:21午马
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16赛季CBA联赛之广夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
2 [报告]
发表于 2013-08-28 10:41 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2013-08-28 10:58 |只看该作者
wangspace 发表于 2013-08-28 10:41
http://bbs.csdn.net/topics/370153775


好帖........

论坛徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午马
日期:2014-10-19 13:40:31酉鸡
日期:2014-11-08 08:44:54处女座
日期:2014-11-10 17:01:21午马
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16赛季CBA联赛之广夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
4 [报告]
发表于 2013-08-28 11:01 |只看该作者
回复 3# sanday9
:wink:


   

论坛徽章:
0
5 [报告]
发表于 2013-08-29 15:19 |只看该作者
对于函数调用而言,标准没有规定函数参数的求值顺序,但是标准规定所有参数求值完毕进入函数体执行之前有一个序列点。
在相邻的两个序列点之间,一个对象只允许被修改一次, 而且如果一个对象被修改则在这两个序列点之间对该变量的读取的唯一目的只能是为了确定该对象的新值。

printf 后面的数值有两次修改i操作,未定义行为。这种问题其实不用太去纠结, 写代码也应该尽量避免。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP