免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: SQ_Linux
打印 上一主题 下一主题

嵌入式死循环为什么基本都是用while(1){} [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
21 [报告]
发表于 2012-06-03 14:40 |只看该作者
本帖最后由 starwing83 于 2012-06-03 14:40 编辑

从语义上说,for(;; )是直接告诉编译器:我要无限循环。
而while (1)是告诉编译器,循环到真变成假的那天吧。

for(;; )更直接一些。而while (1)是不是太过文艺了?

最终都是一个jmp而已。

论坛徽章:
0
22 [报告]
发表于 2012-06-03 16:50 |只看该作者
starwing83 发表于 2012-06-03 14:40
从语义上说,for(;; )是直接告诉编译器:我要无限循环。
而while (1)是告诉编译器,循环到真变成假的那天吧 ...



从语义上说,for(;; )是告诉编译器:先用空语句进行初始化,然后判断空语句是否为真,然后每次循环的时候进行一下空语句的运算,并再次判断空语句是否为真。

当然没有while(1)那么简单直接。



论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
23 [报告]
发表于 2012-06-04 10:23 |只看该作者
本帖最后由 starwing83 于 2012-06-04 10:24 编辑

回复 22# wwwsq


    你的理解是从哪里来的呢?

2 Bothclause-1 and expression-3can be omitted. An omitted expression-2is replaced by a
nonzero constant.


总的来说就是一样的……

论坛徽章:
0
24 [报告]
发表于 2012-06-04 10:52 |只看该作者
本帖最后由 wwwsq 于 2012-06-04 10:56 编辑
starwing83 发表于 2012-06-04 10:23
回复 22# wwwsq



从语义上说,for(;; )是告诉编译器:先用空语句进行初始化,然后判断空语句是否为真,然后每次循环的时候进行一下空语句的运算,并再次判断空语句是否为真。

只是在编译的时候,1和3可以被优化掉而已。
2可以被替换成非零的常量。然后呢,逻辑上还要再转换一次,那是true。

语义上来说for(;; )是告诉编译器:先用空语句进行初始化,然后判断空语句是否为真,然后每次循环的时候进行一下空语句的运算,并再次判断空语句是否为真。
只是编译的时候可以omitted而已


论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
25 [报告]
发表于 2012-06-04 11:02 |只看该作者
回复 24# wwwsq


    果然是个逻辑盲。

注意omit是指的语法,不是指的编译。是说,**你**作为一个程序员可以omit,不是说一个编译器编译的时候可以omit。

replaced by是在你没有写的情况下发生的。即编译的时候根本就不存在这个replaced by问题——它在你没有写的时候,**语义**上已经发生了。编译器不会犯傻到先给你编译一个空语句,再给你replaced by。然而while (1)是可能发生这种情况的(先编译一个true到中间码,后期优化pass再优化掉)。所以我才说最终是一样的。(replaced by的东西和1被优化掉的情形是一样的)

我的问题是,你之前的理解(判断空语句神马的)是从哪里来的,自己猜想的么?标准里面提到了一丁点判断空语句的说法么?判断空语句怎么编译?汇编代码里面怎么表示呢?你咋就知道空语句是什么含义,是true还是false呢?是所有情况都是这样还是只有这里是这样呢?你是想当然瞎猫撞了死老鼠还是在扮猪吃老虎呢?

论坛徽章:
0
26 [报告]
发表于 2012-06-04 11:04 |只看该作者
本帖最后由 wwwsq 于 2012-06-04 11:04 编辑
starwing83 发表于 2012-06-04 11:02
回复 24# wwwsq



什么叫做语义



请对比一下
for (i = 0; i < 100; i++)
for ( ; ; )


论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
27 [报告]
发表于 2012-06-04 11:08 |只看该作者
只要效果相同,用什么又有什么关系呢。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
28 [报告]
发表于 2012-06-04 11:10 |只看该作者
回复 26# wwwsq


    语义就是,你写这个东西,是表达一个什么含义。

编译器是这么处理程序的:
- 首先,源代码被分解为tokens,经过预处理等等filter以后,待用,这时编译器判断词法错误。
- 其次,这些tokens按照一定的规则(就是标准给出的规则组合起来),这时编译器判断语法错误。
- 再然后,这些组合起来的东西会按照标准给出的文字描述,按照编译器作者的理解,转换成那些描述对应的实际操作(比如加法变成加法语法树,比如omit的表达式变成true语法树节点等等),这种语法树代表了编译器作者理解的一种语法的解释方式,即语义
- 再然后,这种由编译器作者理解的解释方式,被按照编译器作者的经验去进行简化,把一些明显不会改变结果的过程省略掉或者优化掉(比如true的判断可以直接去掉,没执行到的语法树也可以去掉等等),这就是优化过程。
- 最后,优化过的语法树被遍历,每个节点生成能执行这个节点功能的汇编代码,这些汇编文本会交给汇编器,以生成实际的机器码。

语义就发生在最中间的那个过程。他用来描述,一个标准限定死的语法,应该会去做什么事情,应该表达一个什么含义,或者应该对编译器提出一个什么要求。(前者基本上是语句,第二个基本上是声明,而后者基本上是pragma这种东西等等)

论坛徽章:
0
29 [报告]
发表于 2012-06-04 11:11 |只看该作者
cobras 发表于 2012-06-04 11:08
只要效果相同,用什么又有什么关系呢。




也是可以了。就像在超市付钱,你可以说“两块钱”,也可以说“三块钱再减一块钱”。

在现实生活中比较荒诞的说法,在编程里面也变得可以接受了。因为听众是编译器。。。。

不过其他程序员review代码还是难免会觉得别扭。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
30 [报告]
发表于 2012-06-04 11:15 |只看该作者
我说的效果是指编译结果的执行效果。包括执行效率和正确性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP