打印

最近遇到一个问题!数学与逻辑!

[复制链接]
1724|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题很简单,功能是这样的,条件C,D,E都成立时,输出LED高电平,如有任一条件不成立,输出LED低电平。

以下两种方式哪一种更好呢? 效率更高呢?请各位指点。


void a(void)
{
    if (C== 1)
    {
        if ((D==1) && (E== 1))
        {
            LED = ENABLE;
        }
        else
        {
            LED = DISABLE;
        }
    }
    else
    {
        LED = DISABLE;
    }
}

void b(void)
{   
    if ((C& D& E) == PASSED)
    {
        LED = ENABLE;   
    }
    if ((C & D & E) == FAILED)
    {
        LED = DISABLE;   
    }
}

相关帖子

沙发
john_lee| | 2012-6-17 15:06 | 只看该作者
这个问题都要纠结?不至于吧。
LED = (c == 1 && d == 1 && e == 1) ? ENABLE : DISABLE;

使用特权

评论回复
板凳
李冬发| | 2012-6-17 17:33 | 只看该作者
显然这个更高:
LED = (c & d & e & 1) ? ENABLE : DISABLE;

使用特权

评论回复
地板
wukunshan| | 2012-6-17 22:07 | 只看该作者
void C(void)
{
    if ((C== 1)&&((D==1) && (E== 1))     LED = ENABLE;
    else   LED = DISABLE;
}
这个效率最高。问号表达式,如2.3楼的表达效形式率最低,尽管表达简洁。
如果不信,请测试。

使用特权

评论回复
5
figo20042005| | 2012-6-17 22:12 | 只看该作者
应该是一起判断,效率最高了,分支少,所有运算都在一句中判断

使用特权

评论回复
6
john_lee| | 2012-6-17 22:50 | 只看该作者
void C(void)
{
    if ((C== 1)&&((D==1) && (E== 1))     LED = ENABLE;
    else   LED = DISABLE;
}
这个效率最高。问号表达式,如2.3楼的表达效形式率最低,尽管表达简洁。
如果不信,请测试。 ...
wukunshan 发表于 2012-6-17 22:07

你自己验证过没有,如果有,请给出验证的结果,如果没有,请不要误导别人。

使用特权

评论回复
7
win2000_li|  楼主 | 2012-6-18 08:50 | 只看该作者
我没有验证,但是都可以实现功能。

因为经验问题,没有方法验证,所以

请各位兄弟位指点一下,怎么去验证

效率的问题?谢谢大家!

使用特权

评论回复
8
win2000_li|  楼主 | 2012-6-18 08:56 | 只看该作者
还一个就是逻辑与(&&)与数学与(&)

void c(void)
{
       if ((c&d&e) == 1)
            lcd = 1;
       else
            lcd = 0;
}

和6楼说的不一样!这两个效率如何区别呢?

使用特权

评论回复
9
wukunshan| | 2012-6-18 09:06 | 只看该作者
技术的问题是一个很严谨的问题,是就是,不是就不是。看楼上的话,相当的不服气,我没有验证过在这里敢乱说?这里可是有名的技术论坛哟,大虾们眼睛是雪亮的,水平是一流的,结论的正确与否自有定论。

使用特权

评论回复
10
xwj| | 2012-6-18 09:33 | 只看该作者
前提都没扯清楚,不能一概而论。

1、问题不清,“效率更高”是指最快的?还是最慢的?还是平均的?
2、变量类型不明确
3、处理器也不明确


要任意情况下都快的话,应该把3个布尔变量位合并到一个字节内,而且最好是负逻辑,这样才能最快。

使用特权

评论回复
11
mohanwei| | 2012-6-18 10:18 | 只看该作者
直接看编译后的汇编代码吧……
C语言源码写得简洁不代表汇编代码简洁……

使用特权

评论回复
12
wukunshan| | 2012-6-18 10:41 | 只看该作者
这个问题其实很简单,实践是检验真理的唯一标准。我的验证情况是:
CPU --AT89S52 ,晶振频率12MHZ;
编译器---keil uV4;
变量类型---unsigned char
验证方法:
#include<reg52.h>
sbit LED=P2^0;
int main(void)
{
     unsigned char C=1,D=1,E=1;
     unsigned char i=0;
     while(1)
     {
             if((C==1)&&(D==1)&&(E==1)) LED=1;//用if...else结构
             else LED = 0;
            // LED=((C==1)&&(D==1)&&(E==1))?1:0;//用问号表达式
              i++;
              C=i%2;//让C在0和1交替取值
      }
      return 0;
}

这段代码就是让单片机P2.0脚(LED)输出脉冲。使用if...else结构的时候,输出频率是41.65KHZ;使用问号表达式的时候输出频率是35.7KHZ。
看看哪种表达代码效率更高?

使用特权

评论回复
13
win2000_li|  楼主 | 2012-6-18 12:43 | 只看该作者
非常感谢wukunshan的网的回复!

以及各位网友的回贴!

使用特权

评论回复
14
平常人| | 2012-6-18 21:50 | 只看该作者
哈哈,所有人都陷入一个误区,为什么要用ELSE呢?省掉ELSE就少了一个分支!

LED=Disable;
if (C&D&E) LED=Enable;

试试吧,代码短,综合效率高! :lol

使用特权

评论回复
15
liang7143| | 2012-6-19 12:39 | 只看该作者
我也写一个

LED = (C&D&E) ;
代码最短!;P

使用特权

评论回复
16
sixgett| | 2012-6-19 16:32 | 只看该作者
:funk:

使用特权

评论回复
17
平常人| | 2012-6-19 17:41 | 只看该作者
我也写一个

LED = (C&D&E) ;
代码最短!;P
liang7143 发表于 2012-6-19 12:39


你这个代码,对于C来说最短,但编译之后可能更长!

不信你可以试试看,:P

使用特权

评论回复
18
shibai8899| | 2012-6-26 17:26 | 只看该作者
不知道 if(C&&D&&E) LED = ENABLE; else LED = DISABLE;行不行???

使用特权

评论回复
19
xxlin1984| | 2012-6-28 16:02 | 只看该作者
测试条件:变量全部设为volatile。
IAR for 430 测试结果:


使用特权

评论回复
20
xxlin1984| | 2012-6-28 16:07 | 只看该作者
第一张图与12L结果相左;
第二章却很诡异地颠覆回来:D

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

718

帖子

1

粉丝