免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sinuos
打印 上一主题 下一主题

[C] int i = 2; i = (i++%3); 执行后,为什么i的值为3 [复制链接]

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
11 [报告]
发表于 2015-04-23 10:22 |只看该作者
回复 9# zsszss0000
可以搜一下序列点。这是之前在知乎上一个问题看来的
“如果没有特别指出,操作符的各个操作数的求值顺序是未定的(unsequenced)。如果某个副作用与同一对象的其它副作用相关,或者使用同一对象求值,就是未定义行为。”
不能发url真忧伤。

   

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
12 [报告]
发表于 2015-04-23 11:54 |只看该作者
回复 6# zsszss0000

优先级!=求值顺序
优先级!=求值顺序
优先级!=求值顺序

重要的事情要重复三遍

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
13 [报告]
发表于 2015-04-23 21:49 来自手机 |只看该作者
看编译器怎么理解了,各位先回家睡觉

明天写个测试,接口完善后晚上继续加班

论坛徽章:
1
摩羯座
日期:2013-11-29 18:02:31
14 [报告]
发表于 2015-04-28 10:48 |只看该作者
我觉得分析++和--的执行顺序一点意义也没有。何必要去记忆那些烦人的运算规则呢?我从来只用括号来保证优先级的。
另外,++和--的实现方式完全和编译器的规则有关,所以可以说,这不是语法层面的,而是编译器层次的。要深入到编译器
内部才能理解这个问题。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
15 [报告]
发表于 2015-04-28 11:49 |只看该作者
回复 15# CUTianrui007

这和括号没关系,加了括号还是错的。

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
16 [报告]
发表于 2015-04-28 17:09 |只看该作者
回复 16# windoze


   估计很多人是这样的:
   扫一眼, 这么短的表达式,一定很简单.
   再一看等号右边,想当然的一定是在讨论类似a=b++;类似这种常见的问题.(左边一个i,有啥好看的);
   于是发表了评论.

论坛徽章:
1
摩羯座
日期:2013-11-29 18:02:31
17 [报告]
发表于 2015-04-28 18:54 |只看该作者
原因是这样的,int i = 2; i = (i++%3); i++是先执行i的动作,也就是分解动作是这样的:
i=(i%3);然后i就等于3了,然后i=3.这时就给i赋给了新值,这个新值是i++后的新值。
所以,自然i就等于3了。
也就是说,无论i=(i++%3),这里做是什么操作,最终结果永远是i++。

我估计,你在不同的编译器上试验,一定会得到不同的结果的。
实现方式和具体的编译器有关。

论坛徽章:
1
摩羯座
日期:2013-11-29 18:02:31
18 [报告]
发表于 2015-04-28 18:57 |只看该作者
强烈建议看汇编代码,一目了然。

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
19 [报告]
发表于 2015-04-29 09:26 |只看该作者
回复 19# CUTianrui007

优先级!=求值顺序

看得懂吗
唉 不要被汇编误导 去搜索一下 未定义行为

PS 不搜索也行 但是拜托你别随便发言误导新人

   

论坛徽章:
0
20 [报告]
发表于 2015-05-03 21:12 |只看该作者
也就是c c++ 才有此 烦恼的问题
   basic  delphi 才不会出现呢
   代码简洁的缩成一行也有他自身的弊病。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP