找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2203|回复: 9
打印 上一主题 下一主题
收起左侧

C语言语句问题 if(x<=y) 和if(x<y||x==y) 一样吗 执行效率谁快

[复制链接]
跳转到指定楼层
楼主
ID:709761 发表于 2022-9-8 17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
if(x<=y)  和if(x<y||x==y) 一样吗 执行效率谁快
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:688692 发表于 2022-9-8 17:28 | 只看该作者
     4: if(x<=y)
C:0x000F    E508     MOV      A,0x08
C:0x0011    D3       SETB     C
C:0x0012    9509     SUBB     A,0x09
C:0x0014    5003     JNC      C:0019
     5: {
     6:         z=1;
C:0x0016    750A01   MOV      0x0A,#0x01
     7: }        


     8: if(x<y||x==y)
C:0x0003    E508     MOV      A,0x08
C:0x0005    C3       CLR      C
C:0x0006    9509     SUBB     A,0x09
C:0x0008    4005     JC       C:000F
C:0x000A    E508     MOV      A,0x08
C:0x000C    B50903   CJNE     A,0x09,C:0012
     9: {
    10:         z=1;
C:0x000F    750A01   MOV      0x0A,#0x01
    11: }


显然,if(x<=y) 这个写法胜出。
回复

使用道具 举报

板凳
ID:451718 发表于 2022-9-8 17:37 | 只看该作者
C语言编译的时候,会自己优化的。  执行效率,主要还是要看你的函数嵌套深度,以及for循环的使用频率。
回复

使用道具 举报

地板
ID:883242 发表于 2022-9-8 18:19 | 只看该作者

换个优化等级就不是这个结果了。
回复

使用道具 举报

5#
ID:999824 发表于 2022-9-8 19:33 | 只看该作者
if(x<=y)这个更快,更好,老手都这样用
回复

使用道具 举报

6#
ID:1007932 发表于 2022-9-8 21:35 | 只看该作者
现在优化后应该是一样的,不过编译器不一样结果也可能不一样,要看汇编代码
回复

使用道具 举报

7#
ID:332444 发表于 2022-9-10 10:05 | 只看该作者
基本一样,不要看汇编语句多寡比较,要实际循环计数时间比较才得出结论,比如a>b只执行一次而a>=b则执行2次,因此慎用有2次的运算符,有时>=或<=可以化为>或<的运算优化。
回复

使用道具 举报

8#
ID:624769 发表于 2022-9-10 14:10 来自触屏版 | 只看该作者
xianfajushi 发表于 2022-9-10 10:05
基本一样,不要看汇编语句多寡比较,要实际循环计数时间比较才得出结论,比如a>b只执行一次而a>=b则执行2次 ...

a>b,就是b-a 是否借位,借位为真,不借位为假。
a>=b,就是a-b 是否借位,不借位为真,借位为假。两者都是一次减法运算,和一次借位标志判断。本质上是一样的执行量,看编译器的“聪明”程度了。
回复

使用道具 举报

9#
ID:434018 发表于 2022-9-10 20:30 | 只看该作者
if(x<=y)快,看编译汇编代码
回复

使用道具 举报

10#
ID:883242 发表于 2022-9-11 03:42 | 只看该作者
一事无成 发表于 2022-9-8 21:35
现在优化后应该是一样的,不过编译器不一样结果也可能不一样,要看汇编代码

然而我用RVMDK自带的v5、v6两种编译器,以及IAR EWARM 8.22一共三种编译器,测试了所有的优化等级,其输出的ARM汇编代码均与沙发的51代码类似, if(x<=y) 只做了做了一次比较,而if(x<y||x==y)忠实的做了两次比较。

显然编译器认为 if(x<=y) 和if(x<y||x==y) 是两种完全不同的逻辑,不能在优化中合并第二种,具体的逻辑思路我也是百撕不得骑姐,大家可以畅所欲言的讨论下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表