求助!

数据错误 2019-09-16 09:17:26
在逻辑表达式a>1&&b++>2中,不应该是++优先级最高,所以先使用b再执行b=b+1吗,为什么会出现短路情况?
...全文
218 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
无形有道 2019-09-25
  • 打赏
  • 举报
回复
引用 23 楼 sty_app 的回复:
[quote=引用 18 楼 hslbloc 的回复:]
[quote=引用 15 楼 sty_app的回复:]
这种代码写出来就是跟自己对着干的。
唯一有研究价值的就是操作符优先级。
可不同的编译器对优先级处理存在某些难以言表的差异,不看汇编,鬼知道编译器做了什么。

所以操作符优先级在C++语法里面,可以说算是最鸡肋的语法了,没有什么是一个括号解决不了的,如果不行,那就再加几个括号即可。

表达式 A && (B && (C)) 的求值顺序也是确定的,即按A,B,C子表达式顺序执行。难道会按C,B,A的顺序执行?[/quote]

其实我表达的意思是,能用人看得懂的话表达,就尽量不要说鬼话。测试VC和G++编译器,都是短路求值优先, 那么
A && (B && (C)) 这样的表达式,用if else 更容易让人理解

if(A)
{
if(B)
{
if(C)
{
....//核心代码
}
}
}

那么楼主的 “a>1&&b++>2”,实际上可以拆成:

if(a>1)
{
if(b>2)
{
b++;
...//核心代码
}
else
b++;
}
[/quote]
完全赞同,这样写的代码质量明显更佳,而且编译器编译的结果区别并不大,即没有任何效率或性能问题
sty_app 2019-09-24
  • 打赏
  • 举报
回复
引用 18 楼 hslbloc 的回复:
[quote=引用 15 楼 sty_app的回复:]
这种代码写出来就是跟自己对着干的。
唯一有研究价值的就是操作符优先级。
可不同的编译器对优先级处理存在某些难以言表的差异,不看汇编,鬼知道编译器做了什么。

所以操作符优先级在C++语法里面,可以说算是最鸡肋的语法了,没有什么是一个括号解决不了的,如果不行,那就再加几个括号即可。

表达式 A && (B && (C)) 的求值顺序也是确定的,即按A,B,C子表达式顺序执行。难道会按C,B,A的顺序执行?[/quote]

其实我表达的意思是,能用人看得懂的话表达,就尽量不要说鬼话。测试VC和G++编译器,都是短路求值优先, 那么
A && (B && (C)) 这样的表达式,用if else 更容易让人理解

if(A)
{
if(B)
{
if(C)
{
....//核心代码
}
}
}

那么楼主的 “a>1&&b++>2”,实际上可以拆成:

if(a>1)
{
if(b>2)
{
b++;
...//核心代码
}
else
b++;
}
qq_45673225 2019-09-23
  • 打赏
  • 举报
回复
++b和b++是不一样的,加号在后面是先参与运算了再自加,加号在前面就是先自加,再把自加后的结果参与运算啊
铖邑 2019-09-21
  • 打赏
  • 举报
回复
有个混乱程序大赛有兴趣可以看一下,各种奇技淫巧,代码没人看懂,下面给个网上找到的例子: main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);} 下次有人为难你的时候,拿这个程序跟他抬杠玩玩
铖邑 2019-09-21
  • 打赏
  • 举报
回复
怎么说呢?可以说是应试考试的悲哀,试题里面会出个这样的题目,就相当于问你,回字有四样写法。会做的人,很可以用来炫耀炫耀,但现实中,谁会这样写呢?不怕被想读懂程序的人拍死吗?我觉得除了那些比较简单的、显而易见的++操作以外,全都要分开写。你写在一起并不见得有什么好处,难道只是想让代码少些一行吗?我可以告诉你,有些奇葩公司考核业绩是看你写代码的行数,那时候都巴不得多写几行滥竽充数。当然这只是个笑话。实际上代码多一行,编译结果并不会变得低效,基本是不影响的,且不会出现歧义。
无形有道 2019-09-21
  • 打赏
  • 举报
回复
引用 15 楼 sty_app的回复:

这种代码写出来就是跟自己对着干的。
唯一有研究价值的就是操作符优先级。
可不同的编译器对优先级处理存在某些难以言表的差异,不看汇编,鬼知道编译器做了什么。

所以操作符优先级在C++语法里面,可以说算是最鸡肋的语法了,没有什么是一个括号解决不了的,如果不行,那就再加几个括号即可。
表达式 A && (B && (C)) 的求值顺序也是确定的,即按A,B,C子表达式顺序执行。难道会按C,B,A的顺序执行?
无形有道 2019-09-21
  • 打赏
  • 举报
回复
引用 16 楼 hslbloc的回复:
[quote=引用 15 楼 sty_app的回复:]
这种代码写出来就是跟自己对着干的。
唯一有研究价值的就是操作符优先级。
可不同的编译器对优先级处理存在某些难以言表的差异,不看汇编,鬼知道编译器做了什么。

所以操作符优先级在C++语法里面,可以说算是最鸡肋的语法了,没有什么是一个括号解决不了的,如果不行,那就再加几个括号即可。
C++也好,C也好,加再多括号都不能改变&&运算符的表达式求值顺序。在ANSI和ISO标准中都有明确规定,&&操作符就是短路求值,会对子表达式的求值顺序施加控制,严格从左到右执行,一旦某子表达式为false,则完全跳过后面的子表达式[/quote] 与编译器无关,或者说编译器必须按标准来实现
无形有道 2019-09-21
  • 打赏
  • 举报
回复
引用 15 楼 sty_app的回复:

这种代码写出来就是跟自己对着干的。
唯一有研究价值的就是操作符优先级。
可不同的编译器对优先级处理存在某些难以言表的差异,不看汇编,鬼知道编译器做了什么。

所以操作符优先级在C++语法里面,可以说算是最鸡肋的语法了,没有什么是一个括号解决不了的,如果不行,那就再加几个括号即可。
C++也好,C也好,加再多括号都不能改变&&运算符的表达式求值顺序。在ANSI和ISO标准中都有明确规定,&&操作符就是短路求值,会对子表达式的求值顺序施加控制,严格从左到右执行,一旦某子表达式为false,则完全跳过后面的子表达式
sty_app 2019-09-19
  • 打赏
  • 举报
回复

这种代码写出来就是跟自己对着干的。
唯一有研究价值的就是操作符优先级。
可不同的编译器对优先级处理存在某些难以言表的差异,不看汇编,鬼知道编译器做了什么。

所以操作符优先级在C++语法里面,可以说算是最鸡肋的语法了,没有什么是一个括号解决不了的,如果不行,那就再加几个括号即可。
无形有道 2019-09-18
  • 打赏
  • 举报
回复
简单的说,尽管&&操作符优先级较低,但它仍然会对两个关系表达式施加控制。对子表达式的组合方式为:(a>1) && ( b++>2) 因此,&&操作符的左操作数总是率先求值的,它的语法工作原理决定了只要左操作数的值为假,则右操作数就会被短路求值。
无形有道 2019-09-18
  • 打赏
  • 举报
回复
引用 8 楼 SuperDay的回复:
这是编译器优化造成的,这个条件表达式是与关系,当a>1为假的时候,编译器认为没必要再去计算&&右边的式子,就被优化掉了; 同理,如果是或关系的表达式,前面是真的时候,||右边的式子也会被优化。 但不是所有的编译器都是这样做的
楼主的表达式求值顺序是已知和确定的,与编译器无关。楼主的疑惑,在于意愿违背了规则。
无形有道 2019-09-18
  • 打赏
  • 举报
回复
引用 楼主 weixin_45650531的回复:
在逻辑表达式a>1&&b++>2中,不应该是++优先级最高,所以先使用b再执行b=b+1吗,为什么会出现短路情况?
复杂表达式的求值顺序是由3个因素决定的:操作符的优先级、操作符的结合性以及操作符是否控制执行的顺序。 你对优先级和组合性的理解都是正确的。但是却忽略了仅凭优先级还不能确定求值的顺序。 在C标准中,有如下规则: 两个相邻操作符的执行顺序由它们的优先级决定。如果两者的优先级相同,则执行顺序由其组合性决定。除此之外,编译器可以自由决定使用任何顺序对表达式进行求值,但是它不能违背逻辑与(&&)、逻辑或(||)、条件(?:)和逗号(,)这4个操作符的控制求值顺序的限制。 也就是说,有4个操作符拥有控制整个表达式求值顺序的最高权限(即第3项决定性因素)。这4个操作符会严格按自己的结合性和语法来控制子表达式求值的顺序,或者短路求值。
铖邑 2019-09-17
  • 打赏
  • 举报
回复
引用 10 楼 weixin_45650531 的回复:
[quote=引用 8 楼 SuperDay的回复:]这是编译器优化造成的,这个条件表达式是与关系,当a>1为假的时候,编译器认为没必要再去计算&&右边的式子,就被优化掉了; 同理,如果是或关系的表达式,前面是真的时候,||右边的式子也会被优化。 但不是所有的编译器都是这样做的
就是说理论上说(按照自增的定义)自增优先级最高应该要在判断后执行b自增,但是实际操作过程中编译器会为了减少计算量自动忽略?[/quote] 编译器大部分实现都是这么做的。而且,这个优先级只是表达式组合上面的优先,并不是计算顺序上面的优先 好比说,a+b+c*d这样的表达式,cd之间的乘法优先组合,但并不一定是这个乘法要先计算啊,也有可能是a+b先计算,这个并影响结果
数据错误 2019-09-17
  • 打赏
  • 举报
回复
引用 8 楼 SuperDay的回复:
这是编译器优化造成的,这个条件表达式是与关系,当a>1为假的时候,编译器认为没必要再去计算&&右边的式子,就被优化掉了; 同理,如果是或关系的表达式,前面是真的时候,||右边的式子也会被优化。 但不是所有的编译器都是这样做的
就是说理论上说(按照自增的定义)自增优先级最高应该要在判断后执行b自增,但是实际操作过程中编译器会为了减少计算量自动忽略?
赵4老师 2019-09-17
  • 打赏
  • 举报
回复
铖邑 2019-09-16
  • 打赏
  • 举报
回复
这是编译器优化造成的,这个条件表达式是与关系,当a>1为假的时候,编译器认为没必要再去计算&&右边的式子,就被优化掉了; 同理,如果是或关系的表达式,前面是真的时候,||右边的式子也会被优化。 但不是所有的编译器都是这样做的
铖邑 2019-09-16
  • 打赏
  • 举报
回复
看来你还是没搞清楚,如果你懂汇编的话,建议你看一下这段代码编译生成的汇编码,就明白了
数据错误 2019-09-16
  • 打赏
  • 举报
回复
引用 5 楼 SuperDay的回复:
还是那句话,优先级只是决定表达式如何组合,但优先级高的操作符并不是要先执行
为什么优先级高的不先执行?
铖邑 2019-09-16
  • 打赏
  • 举报
回复
还是那句话,优先级只是决定表达式如何组合,但优先级高的操作符并不是要先执行
铖邑 2019-09-16
  • 打赏
  • 举报
回复
你说的是当a>1这个条件不满足的时候吗?在这个情况下,b++一般是不会执行,但这个也依赖于编译器实现,比较稳妥的办法就是不要把++操作和比较操作写在一个大的表达式里面,这不是好的编程风格。虽然我们要去理解这个语句代表什么含义,但是在实践中,不要这样写
加载更多回复(3)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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