ycx2002 发表于 2024-2-16 11:26:49

请教一下这两句话是不是一样的功能…

个人认为是实现一样的功能,为啥在工程中就不一样呢?语句功能是等待数组内的值刷新。
while(receive!=0xff&&receive!=0x03);
是否等同为:
while(receive!=0xff);//等待数组内第4个元素为0xff
while(receive!=0x03);//等待数组内第0个元素为0x03


我总认为这两部分表达的意思是一样的!实际应用中是不一样的,为什么呢?

落花萧然 发表于 2024-2-16 11:54:13

看着一样,实际还是有区别
第一个是并列条件执行,中间还有个与的关系,之后出来才while的
第二个是顺序执行

主要是看用的什么解释器
大多数解释器是从右往左解释再执行的
执行逻辑有区别
在特殊情况下,执行结果不一样
具体还要看应用环境

luosifu 发表于 2024-2-16 14:54:48

本帖最后由 luosifu 于 2024-2-16 15:12 编辑

上下句不全,不清楚使用环境,所以不好判断。也不知道是什么语言,如果是C语言的话:

从C语言的语法上来看,上面的语句和下面两条语句不具有等效功能,即使某种情况下用下面的两条语句与上面的结果一样,两种写法的所描述的功能也有很大区别。

上面是先进行“与逻辑”,while里面的内容是“逻辑与”之后的结果;而下面,是首先while了一个数值A,然后又While了一个数值B。

即然敢用while,那说明这个数组的数据是可以由中断修改的,不然就死在这个while里面了。

CPU是顺序执行指令的,并不是同步执行。对于上面第一行语句,必须是同时满足==FF且==03的时候才能跳出。但是对于下面的2条语句,先满足==FF既可以跳出第一个循环(与无关),然后只要满足==03时,跳出第二个循环(与无关)。

用一个简单实例说明吧,换一下数据,假设我要判断一个字符串是不是CAT,那我就要同时判断C,A,T这三个字母的存在,那就用第一种方法,不多解释。

但是如果用第二种方法会出现什么结果?先发送一个第一位是C的字符串,比如CUP,那么满足条件了,进行下一步判断;再发一个第二位是A的字符串,比如BAG,又满足条件了,又进行下一次判断;最后发一个末位是T的字符串,比如PUT,还是满足条件了……

ycx2002 发表于 2024-2-16 16:56:16

落花萧然 发表于 2024-2-16 11:54
看着一样,实际还是有区别
第一个是并列条件执行,中间还有个与的关系,之后出来才while的
第二个是顺序 ...

谢谢解答,我用的是c编写的。这个数组里面有5个元素,由串行通信中断为其赋值,我要做的是等待接收完最后一个元素后进行判断是否是我需要的元素,是的话就跳出,不是的话就继续等待。我用的第一个语句先判断是否5个元素都接受完毕,之前数组是清零了的,然后判断是否是我需要的值。如果是就跳出,如若不是就继续等待。按照运算符符号优先级,应该是先进行比较操作然后再进行逻辑与操作是真还是假。貌似没毛病!
第二个两个语句就很原始了,先等最后一个,再比较前面一个。
我犯愁的是,这两句话应该是一个意思才对啊,可是应用到工程中,第一个不行,第二个就对了!
困惑…

ycx2002 发表于 2024-2-16 17:01:37

luosifu 发表于 2024-2-16 14:54
上下句不全,不清楚使用环境,所以不好判断。也不知道是什么语言,如果是C语言的话:

从C语言的语法上来 ...

谢谢解答,我用的是c编写的。这个数组里面有5个元素,由串行通信中断为其赋值,我要做的是等待接收完最后一个元素后进行判断是否是我需要的元素,是的话就跳出,不是的话就继续等待。我用的第一个语句先判断是否5个元素都接受完毕,之前数组是清零了的,然后判断是否是我需要的值。如果是就跳出,如若不是就继续等待。按照运算符符号优先级,应该是先进行比较操作然后再进行逻辑与操作是真还是假。貌似没毛病!
第二个两个语句就很原始了,先等最后一个,再比较前面一个。
我犯愁的是,这两句话应该是一个意思才对啊,可是应用到工程中,第一个不行,第二个就对了!
困惑…

您说的是在我上面所述的场景下,这两段语句得出的结果不一样?那是为什么呢?请解惑…谢谢!

ycx2002 发表于 2024-2-16 17:04:47

落花萧然 发表于 2024-2-16 11:54
看着一样,实际还是有区别
第一个是并列条件执行,中间还有个与的关系,之后出来才while的
第二个是顺序 ...

我用的是keil编译器

chipset009 发表于 2024-2-16 18:12:24

while无非就是运行多次,if运行一次。把while换成if就该明白了吧。

ycx2002 发表于 2024-2-16 18:34:39

chipset009 发表于 2024-2-16 18:12
while无非就是运行多次,if运行一次。把while换成if就该明白了吧。

用while是让程序停在这里等待的…

t3486784401 发表于 2024-2-16 19:21:28

逻辑都对不上啊,第一个while退出的条件是:4=ff 或 0=03,两个条件满足一个就停止等待; 而后边双while的退出条件是先4=ff,再0=03,要都满足还得有先后顺序。这样的逻辑完全不同

快乐毛毛虫 发表于 2024-2-16 20:41:33

楼上说得对。
另外while(receive!=0xff&&receive!=0x03);最好写成
while((receive!=0xff)&&(receive!=0x03));这样逻辑关系阅读起来更好些。

scoopydoo 发表于 2024-2-16 21:06:52

本帖最后由 scoopydoo 于 2024-2-16 21:09 编辑

不一样的!即使没有中断在后台更新receive 数组的内容,静态地看二者的逻辑也是不一样的。

前一个的逻辑是 receive 等于 0xff 或者 receive 等于 0x03 时执行后续的语句。

后一个的逻辑是 receive 等于 0xff 并且 receive 等于 0x03 时执行后续的语句。

ycx2002 发表于 2024-2-16 21:48:54

t3486784401 发表于 2024-2-16 19:21
逻辑都对不上啊,第一个while退出的条件是:4=ff 或 0=03,两个条件满足一个就停止等待; 而后边双while的 ...

谢谢回答,我是这么理解的,第一部分的语句是先判断[4]!=0xff如果不等于0xff为真,为真就是1   然后判断[0]!=0x03不是03为真,是03则为假,假就是0   然后再将这两者进行逻辑与运算,两个都不等于或者两个有一个不等于即为真,则继续等待,如果两个都等于则为假,就退出while…

我这样理解对吗?

iffi123 发表于 2024-2-16 21:53:16

本帖最后由 iffi123 于 2024-2-16 22:05 编辑

首先你要知道while ()语句的含义,括号里面的逻辑关系运算是一个整体,它的结果要么TRUE要么FALSE, 是不能拿到括号外面来的,&& 表示前后的条件必需同时成立,结果才为TRUE,   if () 语句也是,这是本身的语法规定的,

ycx2002 发表于 2024-2-16 22:01:40

快乐毛毛虫 发表于 2024-2-16 20:41
楼上说得对。
另外while(receive!=0xff&&receive!=0x03);最好写成
while((receive!=0xff)&&( ...

感谢回答,但是我最后使用的是逻辑与运算啊,真&&真才能是真,有一个是假都是假才对啊…我并没有进行逻辑或运算…
关于书写格式,运算符有优先级的,没关系的:D

ycx2002 发表于 2024-2-16 22:04:10

scoopydoo 发表于 2024-2-16 21:06
不一样的!即使没有中断在后台更新receive 数组的内容,静态地看二者的逻辑也是不一样的。

前一个的逻 ...

感谢解答

前一个的逻辑是 receive 等于 0xff 或者 receive 等于 0x03 时执行后续的语句。


我觉得不是“或者”的关系,因为我用的是逻辑与运算而非逻辑或运算哦
页: [1] 2
查看完整版本: 请教一下这两句话是不是一样的功能…