while(nums[i+1] == nums[i++]){} 和 while(nums[i++] == nums[i+1]){} 有什么区别

_Edward Lee 2019-01-16 11:02:43
int i;
vector<int> nums;
请问 while(nums[i+1] == nums[i++]){} 和 while(nums[i++] == nums[i+1]){} 有什么区别,我实际运行的时候前者符合我的要求而后者死循环了。
...全文
835 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin5161678 2019-01-17
  • 打赏
  • 举报
回复
引用 16 楼 火箭筒 的回复:
就这样说吧,++i后,i立即加1,i++后,i仍然是i,但是在下一次使用时,就变成i加1了
就这么说吧 你说错
火箭筒 2019-01-17
  • 打赏
  • 举报
回复
就这样说吧,++i后,i立即加1,i++后,i仍然是i,但是在下一次使用时,就变成i加1了
火箭筒 2019-01-17
  • 打赏
  • 举报
回复
真是不明白,为什么要写写这种乱七八糟的代码
独孤过 2019-01-16
  • 打赏
  • 举报
回复
https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin 可以看一下运算符的结合方向 ==运算符的结合方向是从左至右,也就是,先算左边,再取右边 这样算出来左边的等价于 while(nums[i+1] == nums[i]) ++i; 而右边的等价于 while(nums[i] == nums[i+2]) ++i;
_Edward Lee 2019-01-16
  • 打赏
  • 举报
回复
引用 6 楼 lin5161678 的回复:
引用 4 楼 _HaoLi 的回复:
但是这么写的时候运行起来没问题,不知道为什么反过来的时候就出错了。。
反过来写也一样

感谢,学习一下
lin5161678 2019-01-16
  • 打赏
  • 举报
回复
引用 4 楼 _HaoLi 的回复:
但是这么写的时候运行起来没问题,不知道为什么反过来的时候就出错了。。
反过来写也一样
lin5161678 2019-01-16
  • 打赏
  • 举报
回复
引用 4 楼 _HaoLi 的回复:
但是这么写的时候运行起来没问题,不知道为什么反过来的时候就出错了。。
不是运行没问题就没错
你不知道什么是 未定义行为 就百度搜索一下 C语言 未定义行为 学习一下

至于这个表达式的问题
假设 i 的值是 1
i++这个表达式的副作用会影响到 i 的值
i+1这个表达式的求值结果 可以是 i 自增之前的值 也可以是 i 自增之后的值
无法确定 没有意义
_Edward Lee 2019-01-16
  • 打赏
  • 举报
回复
引用 1 楼 lin5161678 的回复:
nums[i+1] == nums[i++]
是错的
这是未定义行为

但是这么写的时候运行起来没问题,不知道为什么反过来的时候就出错了。。
lin5161678 2019-01-16
  • 打赏
  • 举报
回复
不要偷懒拆分出来写
lin5161678 2019-01-16
  • 打赏
  • 举报
回复
nums[i++] == nums[i+1]
一样是错的
一样是未定义行为
lin5161678 2019-01-16
  • 打赏
  • 举报
回复
nums[i+1] == nums[i++]
是错的
这是未定义行为
lin5161678 2019-01-16
  • 打赏
  • 举报
回复
没有一样 纠正 没有意义
lin5161678 2019-01-16
  • 打赏
  • 举报
回复
引用 10 楼 独孤由过 的回复:
前面忽略了还有更高优先级的运算符,经过反汇编看到运算符解释执行的过程
先执行==两边的[]表达式,从数组取完值存放于连续两个内存空间后再执行i++,最后执行==运算符并根据结果跳转

看汇编怎么执行对这样的代码没有一样
对于这样的代码 编译器可以编译出逻辑不一样的代码
比如把 i++ 插入数组取值中间
独孤过 2019-01-16
  • 打赏
  • 举报
回复 1
引用 8 楼 独孤由过 的回复:
https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin 可以看一下运算符的结合方向 ==运算符的结合方向是从左至右,也就是,先算左边,再取右边 这样算出来左边的等价于 while(nums[i+1] == nums[i]) ++i; 而右边的等价于 while(nums[i] == nums[i+2]) ++i;
前面忽略了还有更高优先级的运算符,经过反汇编看到运算符解释执行的过程 先执行==两边的[]表达式,从数组取完值存放于连续两个内存空间后再执行i++,最后执行==运算符并根据结果跳转
lin5161678 2019-01-16
  • 打赏
  • 举报
回复
引用 8 楼 独孤由过 的回复:
https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin
可以看一下运算符的结合方向
==运算符的结合方向是从左至右,也就是,先算左边,再取右边
这样算出来左边的等价于
while(nums[i+1] == nums[i])
++i;
而右边的等价于
while(nums[i] == nums[i+2])
++i;
乱说
结合方向 好 副作用是否已经生效无关
nums[i+1] == nums[i++]
可以是
nums[i+2] == nums[i]

nums[i++] == nums[i+1]
也可以是
nums[i] == nums[i+1]

64,654

社区成员

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

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