这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » if(a==1)与if(a!=1)的实现区别?

共32条 1/4 1 2 3 4 跳转至

if(a==1)与if(a!=1)的实现区别?

高工
2013-05-08 20:37:11     打赏

今天在进行一段代码的测试时,出现了如下的问题:

代码一:

unsigned char readpinb,

readpinb=GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0);    

    if(readpinb==1)

   {

     GPIO_SetBits(GPIOB,GPIO_Pin_0);          (1)

    }

    else

  {

      GPIO_ResetBits(GPIOB,GPIO_Pin_0);        (2)

   }

代码二:


unsigned char readpinb,

readpinb=GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0);    

      if(readpinb!=1)

     {

       GPIO_SetBits(GPIOB,GPIO_Pin_0);     (3)

     }

     else

    {

      GPIO_ResetBits(GPIOB,GPIO_Pin_0);    (4)

    }

当运行第一段代码的时候,程序只能执行语句(2),语句(1)永远执行不到,试着对其进行修改,改为代码二的形式,这时程序对if进行判断,语句(3)、(4)可以交替执行到,即为预期实现。虽然可以实现但对其原因不甚了解,在此请教一下,还望5大家不吝赐教,多谢




关键词: 代码测试    

高工
2013-05-08 21:06:24     打赏
2楼

lz看看 程序1的readpinb读到的值 输出看看是多少啊?

 

要不把这句 if(readpinb==1)改成这样,if(readpinb)试试~~

 

希望能对楼主有帮助!!


高工
2013-05-08 21:09:05     打赏
3楼
显然读到的是"0",我试试后一种,多谢楼主指点

高工
2013-05-08 21:12:11     打赏
4楼

那为啥用if(a == 1)程序读不到1呢??

 

跟硬件有关系?


高工
2013-05-08 23:40:54     打赏
5楼

我试了一下将 if(readpinb==1)改成if(readpinb),结果还是读不到1,


另外用“!=1”的就没问题,即readpina...


高工
2013-05-08 23:42:19     打赏
6楼

我试了一下将 if(readpinb==1)改成if(readpinb),结果还是读不到1,


另外用“!=1”就没问题,如readpina


高工
2013-05-08 23:42:58     打赏
7楼
不至于吧,跟硬件关系不大

工程师
2013-05-09 00:02:09     打赏
8楼

很奇怪,readpinb的值难道会随 if 语句执行不同判断而改变?

应该是程序执行的先后顺序对readpinb值产生了影响。


但是,代码二能交替运行,

代码一与代码二的区别在于,一个先执行 函数GPIO_ResetBits(),一个先执行 GPIO_SetBits();

如果是程序先后问题引起的。那么第一次只能执行 GPIO_SetBits()才能使程序正常工作,那应该是函数内部的问题了。


LZ可以将代码一的(1),(2),两个函数换下位置验证这个假设。换下位置就与代码二的程序等同了,应该可以交替执行。





工程师
2013-05-09 10:43:24     打赏
9楼

楼上说的有道理,这两条语句是不会出错的,应该看看你的函数执行对硬件的改变


高工
2013-05-09 10:52:43     打赏
10楼

应该是被编译器优化掉了,你看看,你的第一段程序中:你是先读取PB0的输出值,若为1,则再次置1,编译器认为这是没有必要的,只有当PB0=0是才会去执行else语句将PB0清零

不知道楼主注意到没有,你的第二段程序的功能和第一段是相反的,所以它可以都正常被执行


PS:楼主这里读取是某个管脚的输出值,一般很少这样做,都是读取输入值。


共32条 1/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]