从C到C++一直没搞懂的问题

lunarfan 2008-11-28 09:39:55
求ival和ival+1的值是否同为非0

ival && ival+1 // 这样写没问题
ival++ && ival // 为什么这样写就可能有问题了呢?&&操作符是有求值顺序的阿(短路)
// 最多与上面的不同就是如果ival为0,那么ival++牙根就没被计算仅此这点不同
// 但也不能说是错误阿目的是求ival与ival+1的值是否同时为非0

PS:是不是偶钻牛角尖了
...全文
153 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq675927952 2008-11-28
  • 打赏
  • 举报
回复
up 14L
kiffa 2008-11-28
  • 打赏
  • 举报
回复
应该没什么问题,&& 出现之处是一个序列点,在此之前所有的副作用(side effect, i++的副作用就是对自身加1)都必须执行完毕。所以这个表达式本身不会有什么歧义,和第一个表达式的不同之处在于它改变了i的值,而题目本意也许并不想改变i,仅仅只是做一个判断,所以书上会说这样做有问题。
挨踢呃 2008-11-28
  • 打赏
  • 举报
回复
自左向右,如果&&左边为false那右边就短路掉了;如果&&左边为true,就还会再算右边的
xxgamexx 2008-11-28
  • 打赏
  • 举报
回复

[root@localhost ~]# cat 1123.cpp && ./1123
#include <iostream>
using namespace std;

int main()
{
int val=0;
bool b=(val+=1&&val);


cout<<b<<endl;
cout<<val<<endl;
return 0;
}

0
0


这里的 val+=1 就没有计算 而val++ 应该是拷贝了一个备份自加1,最后重新赋值给了val~
rejoice914 2008-11-28
  • 打赏
  • 举报
回复
如果左边的已经能确定值的话,右边就不算了!
rejoice914 2008-11-28
  • 打赏
  • 举报
回复
ival && ival+1 // 这样写没问题
ival++ && ival

这里我觉得编译应该没问题的!
如果ival初始值为0,那么就可能出现不是你预想到的结果!
我看书上是这样的!
霍大脚 2008-11-28
  • 打赏
  • 举报
回复
看看||及&&出现那种情况不在继续啊,你把val&&(val+1)看看
zedzhao 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lunarfan 的回复:]
乱总结下
ival && ival+1 //这个ival如果为0那么ival+1没被计算
ival++ && ival //这个ival++先被计算,如果ival为0,那么右操作数不被计算
细节上有不同,但结果怎么说都是一样的,为什么书上说ival++ && ival 可能会产生问题。
[/Quote]

楼主说清楚点,要是书上说会产生问题那应该会有解释的吧
lann64 2008-11-28
  • 打赏
  • 举报
回复
编译器是会优化的,特别是当ival是一个简单内置类型,比如int时。
lunarfan 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ztz0223 的回复:]
跟c和c++没有关系吧
C/C++ codeival++&&ival//为什么这样写就可能有问题了呢?&&操作符是有求值顺序的阿(短路)//最多与上面的不同就是如果ival为0,那么ival++牙根就没被计算仅此这点不同//但也不能说是错误阿目的是求ival与ival+1的值是否同时为非0

依赖编译器的实现
有的里面设计的ival是一个备份
有的有多个备份,结果当然有差别

[/Quote]
后++会产生一个temp,什么多个备份一个备份不懂阿讲细点阿
lc19890326 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lunarfan 的回复:]
乱总结下
ival && ival+1 //这个ival如果为0那么ival+1没被计算
ival++ && ival //这个ival++先被计算,如果ival为0,那么右操作数不被计算
细节上有不同,但结果怎么说都是一样的,为什么书上说ival++ && ival 可能会产生问题。

[/Quote]

ival++&&ival没啥问题啊
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复
跟c和c++没有关系吧
ival++ && ival  // 为什么这样写就可能有问题了呢?&&操作符是有求值顺序的阿(短路) 
// 最多与上面的不同就是如果ival为0,那么ival++牙根就没被计算仅此这点不同
// 但也不能说是错误阿目的是求ival与ival+1的值是否同时为非0


依赖编译器的实现
有的里面设计的ival是一个备份
有的有多个备份,结果当然有差别
lc19890326 2008-11-28
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

int main()
{
int val=0;
bool b=(val++&&val);
cout<<b<<endl;
cout<<val<<endl;
return 0;
}

val++为0,但之后val被自加了啊,后面输出的val=1
说实话不是很懂你题目的意思啊大哥
lunarfan 2008-11-28
  • 打赏
  • 举报
回复
乱总结下
ival && ival+1 //这个ival如果为0那么ival+1没被计算
ival++ && ival //这个ival++先被计算,如果ival为0,那么右操作数不被计算
细节上有不同,但结果怎么说都是一样的,为什么书上说ival++ && ival 可能会产生问题。
lunarfan 2008-11-28
  • 打赏
  • 举报
回复
那么&&右边的操作数牙根就没被计算

65,196

社区成员

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

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