最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

編譯if嵌套的效率

作者:voicevon 欄目:單片機(jī)
編譯if嵌套的效率
prog1:
if ((a==1)  && (b==1))
    dosomething;

prog2:
if (a==1)
    if(b==1)
        dosomething;
編譯后,有不同嗎?空間和事件上有什么不同?

2樓: >>參與討論
zhiwei
編譯的結(jié)果應(yīng)該是一樣的
用ICC或其他編譯器編譯一下看list文件就知道了。

3樓: >>參與討論
DEF
不一樣啊
prog1編譯器可以根據(jù)上下文進(jìn)行判斷是先判斷 a==1 還是 b==1 或者只選其1
prog2則有了先后順序的約束.

處理這兩種判斷必須根據(jù)上下程序的關(guān)系.還有編譯器的優(yōu)化選項(xiàng).
如果整個(gè)程序只是進(jìn)行上面的判斷出來(lái)的結(jié)果一樣不奇怪,可如果是大程序判斷被優(yōu)化掉也不足為奇.

4樓: >>參與討論
zhiwei
編譯器絕對(duì)是按照順序判斷的。
按書(shū)寫的條件的先后順序

5樓: >>參與討論
John_Lee
4樓對(duì),3樓錯(cuò),鑒定完畢
 
6樓: >>參與討論
DEF
幼稚
知道優(yōu)化是什么嗎?

7樓: >>參與討論
John_Lee
哎,都說(shuō)了已經(jīng)鑒定完畢了,咋還要鬧嗦!
貼一段《The C PROGRAMMING Language》的原文:

A.7.14 Logical AND Operator
    logical-AND-expression:
      inclusive-OR-expression
      logical-AND-expression && inclusive-OR-expression
The && operator groups left-to-right. It returns 1 if both its operands compare unequal to zero, 0 otherwise. Unlike &, && guarantees left-to-right EVALUATION: the first operand is evaluated, including all side effects; if it is equal to 0, the VALUE of the expression is 0. Otherwise, the right operand is evaluated, and if it is equal to 0, the expression's VALUE is 0, otherwise 1.

各人仔細(xì)看清楚!

8樓: >>參與討論
DEF
受不了
看來(lái)你是個(gè)學(xué)生啊!
    做人不要這么刻板,上面的E文誰(shuí)都看得懂.可你忽略了該描述的首要前提.
    那是標(biāo)準(zhǔn)C的編譯過(guò)程,也就是說(shuō)沒(méi)有經(jīng)過(guò)任何的優(yōu)化.也就談不上什么效率不效率了.每種C編譯器的優(yōu)化能力都不一樣,這也是每種C編譯器價(jià)格的區(qū)別.如果都按照標(biāo)準(zhǔn)編譯過(guò)程去處理,那就沒(méi)有編譯優(yōu)化選項(xiàng)了.再快的CPU也跑不起這樣臃腫繁瑣的代碼.
    老實(shí)的說(shuō)我不反對(duì)看書(shū),或引用書(shū)上的資料.可必須驗(yàn)證確保書(shū)上的描述都是正確的.因?yàn)槿藷o(wú)完人.例如sin函數(shù)很多書(shū)都把它輸入變量寫成角度,可事實(shí)上是弧度.所以只能用事實(shí)說(shuō)話.如果你能寫出一段代碼能在任何優(yōu)化選項(xiàng)中得出相同從左到右的結(jié)果.我送一個(gè)服字給你,并向你道歉.

9樓: >>參與討論
computer00
編譯出來(lái)看匯編結(jié)果不就知道了?暈死。實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)
 
10樓: >>參與討論
平常人
不同意DEF的說(shuō)法!贊成John_Lee
任何編譯器都是先編譯再優(yōu)化,編譯是產(chǎn)生代碼的過(guò)程;優(yōu)化可以作用于產(chǎn)生的中間代碼,也可以作用于產(chǎn)生的最終代碼,或兩部分都有,這要看優(yōu)化算法的復(fù)雜程度,這也是不同編譯器間的主要區(qū)別;優(yōu)化是為了減少代碼的長(zhǎng)度,但優(yōu)化絕對(duì)不能改變?cè)a的語(yǔ)義

就prog1這個(gè)程序而言,編譯后的代碼必須是先判斷(a==1)再判斷(b==1),不能顛倒!優(yōu)化時(shí)可以根據(jù)a或b的演變優(yōu)化掉(a==1)的代碼或(b==1)的代碼,但絕對(duì)不能把這兩段代碼顛倒過(guò)來(lái),即使a與b沒(méi)有任何關(guān)系。

退一步說(shuō),如果把這兩段代碼顛倒過(guò)來(lái),在某些條件下還有可能造成執(zhí)行效率下降;如a=0且b=1時(shí),if(a==1 && b==1) 比 if(b==1 && a==1) 的執(zhí)行效率高!

11樓: >>參與討論
DEF
想清楚了沒(méi)有?
"先編譯再優(yōu)化"不懂你這個(gè)理論!編譯結(jié)果已經(jīng)出來(lái)了,還能怎樣優(yōu)化?你是說(shuō)OBJ,LIB這些還能進(jìn)行優(yōu)化嗎?

我的理解!
1:先預(yù)處理(主要處理"#"命令和宏)生成另一個(gè)編譯器可理解的文本(中間文本)
2:語(yǔ)法檢查(查錯(cuò))
3:真正的編譯(包括優(yōu)化)
4:輸出目標(biāo)(obj,lib)
5:連接(生成可執(zhí)行代碼)
因?yàn)闆](méi)有查資料以上步驟可能有錯(cuò)!但很多C的書(shū)多是這樣寫的.

所以優(yōu)化只能存在于編譯的過(guò)程中.OBJ,LIB文件是不能再優(yōu)化因?yàn)椴荒軓?fù)原并且中間處理文本不存在.

按你的從左到右的邏輯來(lái)說(shuō)以下的代碼都會(huì)讓編譯器變成白癡.

例1:
a=b+1+2+3;

編譯結(jié)果只能是

a=(((b+1)+2)+3);

而并非

a=b+6:


例2:
c=a+1+b+2;

編譯結(jié)果只能是
c=(((a+1)+b)+2);

而并非

c=a+b+3;

你見(jiàn)過(guò)有這樣白癡的編譯器嗎?
最終結(jié)果都不是你所說(shuō)的從左到右啊!你能說(shuō)它們都有問(wèn)題都違背了程序員的描述初衷嗎?


看出問(wèn)題了嗎?
編譯器并沒(méi)有絕對(duì)按照從左到右的描述原則,因?yàn)檫@些運(yùn)算的等級(jí)是一樣的.不管誰(shuí)先加結(jié)果都是不會(huì)受到影響的.同樣&&兩邊的運(yùn)算等級(jí)都是一樣的所以先處理那一邊對(duì)最終的結(jié)果都不會(huì)影響.編譯器調(diào)整它的處理循序也是理所當(dāng)然的,它并沒(méi)有違背程序員的描述,因?yàn)榻Y(jié)果沒(méi)有受到影響.

你舉的例子就不能反過(guò)來(lái)想嗎?
如a=1且b=0時(shí), if(b==1 && a==1) 比 if(a==1 && b==1)  的執(zhí)行效率高!

還告訴你!你好意調(diào)整判斷順序,編譯器是不一定領(lǐng)情的.因?yàn)樗凶约旱南敕?所以不要做無(wú)用工,編寫代碼必須以人為主才能更容易讀懂,流通,傳播.編譯器懂不懂用不著你操心.

12樓: >>參與討論
平常人
DEF顯然沒(méi)有學(xué)過(guò)編譯理論,請(qǐng)找本講編譯的書(shū)看看再討論吧


"先編譯再優(yōu)化"不懂你這個(gè)理論!編譯結(jié)果已經(jīng)出來(lái)了,還能怎樣優(yōu)化?你是說(shuō)OBJ,LIB這些還能進(jìn)行優(yōu)化嗎?

我的理解!
1:先預(yù)處理(主要處理"#"命令和宏)生成另一個(gè)編譯器可理解的文本(中間文本)
2:語(yǔ)法檢查(查錯(cuò))
3:真正的編譯(包括優(yōu)化)
4:輸出目標(biāo)(obj,lib)
5:連接(生成可執(zhí)行代碼)
因?yàn)闆](méi)有查資料以上步驟可能有錯(cuò)!但很多C的書(shū)多是這樣寫的.





C語(yǔ)言書(shū)里所講的“編譯”與編譯理論里講的“編譯”是兩個(gè)概念;C語(yǔ)言里所講的“編譯”是你講的第3步,但編譯理論里講的“編譯”只是你的第3步中的一部分,它包括結(jié)構(gòu)分析、結(jié)構(gòu)制表、代碼生成、引用關(guān)系的分析等很多內(nèi)容,這其中包括語(yǔ)義級(jí)別優(yōu)化的內(nèi)容;所謂“優(yōu)化”是另一部分,主要是在前面生成的代碼基礎(chǔ)上再進(jìn)行非語(yǔ)義級(jí)的優(yōu)化;我所講的“先編譯再優(yōu)化”是在這個(gè)意義上的概念。

在編譯理論里也有你講的第1、2步,但在這兩步之間還有一個(gè)詞法分析。你所講的第4、5步根本不屬于編譯理論的范疇。


不要以為別人都是笨蛋,別人都想不清楚,先問(wèn)問(wèn)你自己想清楚沒(méi)有。

13樓: >>參與討論
John_Lee
DEF敢把他的言論發(fā)到csdn上嗎?
我估計(jì)結(jié)果有兩種:
1、沒(méi)人理會(huì)(這種常識(shí)性錯(cuò)誤,不值得花時(shí)間回貼)。
2、被人嘲笑和痛扁(如果高手有時(shí)間和好心情)。


14樓: >>參與討論
John_Lee
這里真正懂理論的不多啊
連圈圈都說(shuō)要實(shí)踐才知道,悲哀啊。實(shí)踐僅僅能說(shuō)明有限的個(gè)案,但如果不去了解理論的話,你永遠(yuǎn)不知道下一個(gè)實(shí)例(本案的if之類)的編譯結(jié)果和你預(yù)期的是否完全一致。

15樓: >>參與討論
computer00
哈哈~~~~不去試一試,理論再多也無(wú)用.
我喜歡根據(jù)最后的結(jié)果來(lái)推測(cè)理由,嘿嘿...

不同的結(jié)果,就可以得出不同的理由。相反,一開(kāi)始就有一個(gè)理由,很多時(shí)候會(huì)令人尷尬~~~~只有試過(guò)之后才能堅(jiān)定我的理由。

16樓: >>參與討論
computer00
用keil C51寫了簡(jiǎn)單的測(cè)試結(jié)果,大家可以看看它是怎么做的
我一般寫程序都很少使用技巧,盡量使用可讀性強(qiáng)的代碼,犧牲一點(diǎn)速度或者ROM無(wú)所謂.
只有在那些很特殊的場(chǎng)合,才考慮代碼優(yōu)化.在ROM容量足夠,速度無(wú)要求的場(chǎng)合,搞一些
技巧性的東西意義不大,有點(diǎn)勞命傷財(cái)?shù)母杏X(jué)。


unsigned CHAR a,b;   //全局變量



////////////////////////////////////////////////////
第一個(gè)if((a==1)&&(b==1))結(jié)構(gòu),需要4條指令,10字節(jié)ROM
/////////////////////////////////////////////////////

   510:  if((a==1)&&(b==1))
C:0x0E30    E528     MOV      A,a(0x28)
C:0x0E32    B40107   CJNE     A,#0x01,C:0E3C
C:0x0E35    E529     MOV      A,b(0x29)
C:0x0E37    B40102   CJNE     A,#0x01,C:0E3C
   511:  {
   512:   a++;
C:0x0E3A    0528     INC      a(0x28)
   513:  }


////////////////////////////////////////////////////
第二個(gè)if(a==1) if(b==1)結(jié)構(gòu),需要4條指令,10字節(jié)ROM
跟第一個(gè)完全一樣
/////////////////////////////////////////////////////

   510:  if((a==1))
C:0x0E30    E528     MOV      A,a(0x28)
C:0x0E32    B40107   CJNE     A,#0x01,C:0E3C
   511:   if((b==1))
C:0x0E35    E529     MOV      A,b(0x29)
C:0x0E37    B40102   CJNE     A,#0x01,C:0E3C
   512:  {
   513:   a++;
C:0x0E3A    0528     INC      a(0x28)
   514:  }


////////////////////////////////////////////////////
第三個(gè)先if(a==1),然后if(a==b),需要3條指令,8字節(jié)ROM
節(jié)省了1條指令,2字節(jié)ROM
/////////////////////////////////////////////////////

   511:  if((a==1))
C:0x0E30    E528     MOV      A,a(0x28)
C:0x0E32    B40105   CJNE     A,#0x01,C:0E3A
   512:   if((a==b))
C:0x0E35    B52902   CJNE     A,b(0x29),C:0E3A
   513:  {
   514:   a++;
C:0x0E38    0528     INC      a(0x28)
   515:  }

////////////////////////////////////////////////////
第四個(gè)先if(a==b),然后if(a==1),結(jié)果跟第三個(gè)一樣
/////////////////////////////////////////////////////

   511:  if((a==b))
C:0x0E30    E528     MOV      A,a(0x28)
C:0x0E32    B52905   CJNE     A,b(0x29),C:0E3A
   512:   if((a==1))
C:0x0E35    B40102   CJNE     A,#0x01,C:0E3A
   513:  {
   514:   a++;
C:0x0E38    0528     INC      a(0x28)
   515:  }

////////////////////////////////////////////////////
第五個(gè)先將兩個(gè)放在一起與,結(jié)果跟第三個(gè)一樣
/////////////////////////////////////////////////////


   510:  if((a==b)&&(a==1))
C:0x0E30    E528     MOV      A,a(0x28)
C:0x0E32    B52905   CJNE     A,b(0x29),C:0E3A
C:0x0E35    B40102   CJNE     A,#0x01,C:0E3A
   511:  {
   512:   a++;
C:0x0E38    0528     INC      a(0x28)
   513:  }

////////////////////////////////////////////////////
第六個(gè)跟第五個(gè)差不多,交換一下位置,結(jié)果跟第三個(gè)一樣
/////////////////////////////////////////////////////

   510:  if((a==1)&&(a==b))
C:0x0E30    E528     MOV      A,a(0x28)
C:0x0E32    B40105   CJNE     A,#0x01,C:0E3A
C:0x0E35    B52902   CJNE     A,b(0x29),C:0E3A
   511:  {
   512:   a++;
C:0x0E38    0528     INC      a(0x28)
   513:  }

////////////////////////////////////////////////////
第七個(gè)是假設(shè)a和b在這里判斷之后,下面就沒(méi)有用了,可以
對(duì)它做自減操作.利用51的DJNZ這條指令,可以省掉兩條指令.
只有兩條指令,6字節(jié)ROM.
/////////////////////////////////////////////////////
   511:  if(((--a)==0)&&((--b)==0))
C:0x0E30    D52805   DJNZ     a(0x28),C:0E38
C:0x0E33    D52902   DJNZ     b(0x29),C:0E38
   512:   {
   513:    a++;
C:0x0E36    0528     INC      a(0x28)
   514:   }




想不出其它可以更優(yōu)化的方法了。本人沒(méi)學(xué)過(guò)編譯原理,只知道按常規(guī)去推測(cè),理解.

* - 本貼最后修改時(shí)間:2006-11-27 1:42:10 修改者:computer00

17樓: >>參與討論
computer00
再來(lái)一個(gè),編譯結(jié)果自己看吧
unsigned CHAR b;   //全局變量

//這回將a定義為一個(gè)宏


   511:  #define a (b*2+3*b+b+b)
   512:   
   513:  if((a==1)&&(b==1))
C:0x0D37    E528     MOV      A,b(0x28)     //先計(jì)算a的值
C:0x0D39    75F003   MOV      B(0xF0),#0x03
C:0x0D3C    A4       MUL      AB
C:0x0D3D    FD       MOV      R5,A
C:0x0D3E    ACF0     MOV      R4,B(0xF0)
C:0x0D40    E528     MOV      A,b(0x28)
C:0x0D42    75F002   MOV      B(0xF0),#0x02
C:0x0D45    A4       MUL      AB
C:0x0D46    2D       ADD      A,R5
C:0x0D47    FF       MOV      R7,A
C:0x0D48    E5F0     MOV      A,B(0xF0)
C:0x0D4A    3C       ADDC     A,R4
C:0x0D4B    FE       MOV      R6,A
C:0x0D4C    AD28     MOV      R5,b(0x28)
C:0x0D4E    7C00     MOV      R4,#0x00
C:0x0D50    EF       MOV      A,R7
C:0x0D51    2D       ADD      A,R5
C:0x0D52    FF       MOV      R7,A
C:0x0D53    EC       MOV      A,R4
C:0x0D54    3E       ADDC     A,R6
C:0x0D55    CF       XCH      A,R7
C:0x0D56    2D       ADD      A,R5
C:0x0D57    CF       XCH      A,R7
C:0x0D58    3C       ADDC     A,R4
C:0x0D59    FE       MOV      R6,A
C:0x0D5A    EF       MOV      A,R7
C:0x0D5B    6401     XRL      A,#0x01
C:0x0D5D    4E       ORL      A,R6
C:0x0D5E    7007     JNZ      C:0D67      //根據(jù)a的值跳轉(zhuǎn)
C:0x0D60    E528     MOV      A,b(0x28)
C:0x0D62    B40102   CJNE     A,#0x01,C:0D67  //到這里才判斷b是否為1
   514:   {
   515:    b++;
C:0x0D65    0528     INC      b(0x28)
   516:   }

//////////////////////////////////////////////////////////////////////

   511:  #define a (b*2+3*b+b+b)
   512:   
   513:  if((b==1)&&(a==1))
C:0x0D37    E528     MOV      A,b(0x28)
C:0x0D39    6401     XRL      A,#0x01
C:0x0D3B    702B     JNZ      C:0D68     //判斷b是否為1,并跳轉(zhuǎn)
C:0x0D3D    E528     MOV      A,b(0x28)    //計(jì)算a的值
C:0x0D3F    75F003   MOV      B(0xF0),#0x03
C:0x0D42    A4       MUL      AB
C:0x0D43    FD       MOV      R5,A
C:0x0D44    ACF0     MOV      R4,B(0xF0)
C:0x0D46    E528     MOV      A,b(0x28)
C:0x0D48    75F002   MOV      B(0xF0),#0x02
C:0x0D4B    A4       MUL      AB
C:0x0D4C    2D       ADD      A,R5
C:0x0D4D    FF       MOV      R7,A
C:0x0D4E    E5F0     MOV      A,B(0xF0)
C:0x0D50    3C       ADDC     A,R4
C:0x0D51    FE       MOV      R6,A
C:0x0D52    AD28     MOV      R5,b(0x28)
C:0x0D54    7C00     MOV      R4,#0x00
C:0x0D56    EF       MOV      A,R7
C:0x0D57    2D       ADD      A,R5
C:0x0D58    FF       MOV      R7,A
C:0x0D59    EC       MOV      A,R4
C:0x0D5A    3E       ADDC     A,R6
C:0x0D5B    CF       XCH      A,R7
C:0x0D5C    2D       ADD      A,R5
C:0x0D5D    CF       XCH      A,R7
C:0x0D5E    3C       ADDC     A,R4
C:0x0D5F    FE  
18樓: >>參與討論
94馬甲
呵呵,這不就結(jié)了
 
19樓: >>參與討論
computer00
結(jié)了沒(méi)有,很難說(shuō)。事實(shí)上,不同的編譯器,不同的處理器,
都要用不同的優(yōu)化策略。但需要優(yōu)化的代碼通常是非常小的部分,例如不到10%。

20樓: >>參與討論
平常人
重復(fù)一點(diǎn),不論如何優(yōu)化后語(yǔ)義不能變
DEF的例子中所提到的問(wèn)題與我們討論的無(wú)關(guān)!

a=(((b+1)+2)+3);
c=a+1+b+2;
這兩個(gè)語(yǔ)句里的常量當(dāng)然可以在編譯的初期(語(yǔ)法分析部分)合并掉,變成:
a=b+6;
c=a+b+3;

而且 c=a+b+3 中的 a+b 在某種情況下(如寄存器相關(guān)時(shí))可以變成 b+a,但這種變換并不能節(jié)省代碼空間,00的實(shí)驗(yàn)也證明了。

還是上兩個(gè)例子,若這兩條語(yǔ)句是同時(shí)出現(xiàn),編譯器很可能(在檢查語(yǔ)義時(shí))優(yōu)化為:
c=b+b+9 或 c=(b<<1)+9

至于(a==1)&&(b==1),在語(yǔ)義上只要靜態(tài)地不能分析出a=1或b=1,顛倒布爾表達(dá)式的解析是不能節(jié)省代碼空間的,但在寄存器相關(guān)時(shí)顛倒的順序有可能提高運(yùn)行效率。從這個(gè)意義上講樓主的prog1和prog2的效果不一樣,3樓的結(jié)論正確但理論不正確,他是從節(jié)省代碼空間的角度解釋的。

21樓: >>參與討論
computer00
TO DEF: 我還真見(jiàn)過(guò)這么白癡的編譯器.......
這個(gè)是C代碼

unsigned CHAR b;
#define a (CHAR)((b+0x55)+(b+0x66))

void main(void)
{
if((a==1)&&(b==1))
{
  b++;
}


優(yōu)化選則為0的編譯結(jié)果:
   509: void main(void)
   510: {
   511:  if((a==1)&&(b==1))
C:0x0F17    E528     MOV      A,b(0x28) ;將b放入A寄存器
C:0x0F19    2466     ADD      A,#0x66   ;相當(dāng)于b加0x66
C:0x0F1B    FF       MOV      R7,A      ;A暫時(shí)保存到R7中(R7=b+0x66)
C:0x0F1C    E528     MOV      A,b(0x28)  ;將b再放入到A寄存器中
C:0x0F1E    2455     ADD      A,#0x55    ;相當(dāng)于b加0x55
C:0x0F20    FE       MOV      R6,A       ;將A暫存在R6中
C:0x0F21    EE       MOV      A,R6       ;然后再將R6恢復(fù)到A中(R6=b+0x55)
C:0x0F22    2F       ADD      A,R7       ;相當(dāng)于R6和R7相加,結(jié)果為b+0x55+b+0x66
C:0x0F23    FF       MOV      R7,A       ;將結(jié)果保存回R7
C:0x0F24    EF       MOV      A,R7       ;又把結(jié)果調(diào)回來(lái)
C:0x0F25    B40107   CJNE     A,#0x01,C:0F2F  ;判斷結(jié)果是否為1.
C:0x0F28    E528     MOV      A,b(0x28)
C:0x0F2A    B40102   CJNE     A,#0x01,C:0F2F
   512:  {
   513:   b++;
C:0x0F2D    0528     INC      b(0x28)
   514:  }

看上去里面有兩個(gè)很SB的語(yǔ)句:
C:0x0F20    FE       MOV      R6,A       ;將A暫存在R6中
C:0x0F21    EE       MOV      A,R6       ;然后再將R6恢復(fù)到A中(R6=b+0x55)
C:0x0F23    FF       MOV      R7,A       ;將結(jié)果保存回R7
C:0x0F24    EF       MOV      A,R7       ;又把結(jié)果調(diào)回來(lái)




下面是優(yōu)化為8時(shí)的編譯結(jié)果:
   509: void main(void)
   510: {
   511:  if((a==1)&&(b==1))
C:0x0E30    E528     MOV      A,b(0x28)
C:0x0E32    2466     ADD      A,#0x66  ;先計(jì)算b+0x66
C:0x0E34    FF       MOV      R7,A
C:0x0E35    E528     MOV      A,b(0x28) ;再計(jì)算b+0x55
C:0x0E37    2455     ADD      A,#0x55
                                         ;這里被優(yōu)化掉了兩條SB語(yǔ)句
C:0x0E39    2F       ADD      A,R7      ;相加
C:0x0E3A    FF       MOV      R7,A      
C:0x0E3B    BF0107   CJNE     R7,#0x01,C:0E45  ;這個(gè)語(yǔ)句也有點(diǎn)SB,明明可以用A,還要轉(zhuǎn)到R7去搞
C:0x0E3E    E528     MOV      A,b(0x28)
C:0x0E40    B40102   CJNE     A,#0x01,C:0E45
   512:  {
   513:   b++;
C:0x0E43    0528     INC      b(0x28)
   514:  }






22樓: >>參與討論
農(nóng)民講習(xí)所
必須一個(gè)個(gè)算,不能合并是對(duì)的。
常數(shù)計(jì)算是編譯器自動(dòng)進(jìn)行,但變量表達(dá)式不能簡(jiǎn)單合并,存在著變量溢出問(wèn)題。如果把變量合并了就不符合表達(dá)式要求了。

所以編譯器是對(duì)的。

23樓: >>參與討論
hudaidai
同意John_Lee
編譯器必須在保證正確性的前提下優(yōu)化。

C語(yǔ)言的“&&”和“||”操作,按照標(biāo)準(zhǔn)的定義,必須按照從左到右的次序計(jì)算,而且短路優(yōu)化是必須的!

若&&操作左邊的表達(dá)式已經(jīng)算出來(lái)為0,后面的表達(dá)式必須不再計(jì)算!

這里不是編譯器能夠個(gè)性化的地方。而是標(biāo)準(zhǔn)嚴(yán)格規(guī)定的內(nèi)容。

事實(shí)上,標(biāo)準(zhǔn)也說(shuō)明了有一些特性是“Implementation-defined behavior”,還有一些是“undefined",等等。這些地方才是不同編譯器可能有差異的地方。

比如,我就經(jīng)常寫這樣的代碼:

if (count && !--count)
    ...

這是一個(gè)遞減到0的計(jì)數(shù)器。在我看來(lái),如果哪個(gè)編譯器把count減成負(fù)數(shù)了,那就和把加法編譯成乘法一樣不可原諒。

好在目前為止用過(guò)的6、7種編譯器還沒(méi)有這樣弱智的。:)

PS:關(guān)于C語(yǔ)言的問(wèn)題不妨多看看C faq,看不懂英文也沒(méi)關(guān)系,現(xiàn)在有人翻譯出中文版的了。多看看,沒(méi)壞處的,免得在論壇上別人貽笑大方。


C faq(中文版)

24樓: >>參與討論
computer00
if (count && !--count)讓人頭暈~~~~~~~~~
 
25樓: >>參與討論
hudaidai
哈哈,確實(shí)
現(xiàn)在俺制定的編碼規(guī)范以及靜態(tài)檢查工具已經(jīng)不允許這樣的代碼了:)

但從C語(yǔ)言標(biāo)準(zhǔn)的角度上,還是有意義的。

這樣的代碼不會(huì)太頭暈吧?(引用自C faq)

while((c = getchar()) != EOF && c != '\n')
    ...
這些運(yùn)算符在此處有一個(gè)特殊的 ``短路" 例外: 如果左邊的子表達(dá)式?jīng)Q定最終結(jié)果 (即,真對(duì)于 || 和假對(duì)于 && ) 則右邊的子表達(dá)式不會(huì)計(jì)算。因此, 從左至右的計(jì)算可以確保, 對(duì)逗號(hào)表達(dá)式也是如此。而且, 所有這些運(yùn)算符  (包括 ? : ) 都會(huì)引入一個(gè)額外的內(nèi)部序列點(diǎn) (參見(jiàn)問(wèn)題 3.7)。 

26樓: >>參與討論
94馬甲
繼續(xù)跟蹤中... ...
 
27樓: >>參與討論
computer00
不會(huì)太頭暈,但是有點(diǎn)頭暈就讓人夠受的了……
特別是要給新手講解時(shí),簡(jiǎn)直是自己搬個(gè)石頭砸自己的腳——砸了還不能喊疼……倒塌了~~~~~~~~

* - 本貼最后修改時(shí)間:2006-11-27 16:21:55 修改者:computer00

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)教avr中的一個(gè)奇怪語(yǔ)法.
誰(shuí)知道atof函數(shù)?有詳細(xì)的參數(shù)么?
libslavr.a是一個(gè)什么文件啊?
問(wèn)個(gè)噴飯問(wèn)題:請(qǐng)問(wèn)如何進(jìn)入休眠模式?
紅外解碼
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào)