亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 兩道嵌入式面試題 [打印本頁]

作者: moonwhite999    時間: 2010-03-19 22:19
標(biāo)題: 兩道嵌入式面試題
1. for(i=1;i<N;i++)
    {
           if(condition)
              DoSomeThing;
           else
              DoOtherThing;
    }

    if(condition)
    {
          for(i=1;i<N;i++)
               DoSomeThing;
    }
    else
    {
          for(i=1;i<N;i++)
              DoOtherThing;
    }
這兩種實現(xiàn)方式分別有什么優(yōu)缺點?感覺很多招嵌入式的,都喜歡考這個


2.找出一個字符串中第一個僅出現(xiàn)了一次的字符,并輸出它的位置,例如abcdabce,則答案是d,位置是3
作者: moonwhite999    時間: 2010-03-19 22:23
自己頂一個,第一題我也很想知道答案,望強者不吝賜教
第二題,面試的說我的做法不適用于嵌入式,我本就沒做底層嵌入式開發(fā),想看看諸位大蝦的答案
作者: dozec    時間: 2010-03-19 22:27
第一題看看林銳高質(zhì)量C/C++編程的附錄B,那里有。
作者: phy0077    時間: 2010-03-19 22:27
1算個優(yōu)化之類的問題,但要視具體情況定
如果語句不復(fù)雜,編譯器對循環(huán)的優(yōu)化能力還是很強的

2 hash就搞定了
作者: moonwhite999    時間: 2010-03-19 22:37
回復(fù) 3# dozec

    原來如此,我把它想高深了
    看來找工作之前,得認(rèn)真復(fù)習(xí)這本書的內(nèi)容了
作者: doofy    時間: 2010-03-19 22:50
大蝦們的回答都很簡練,
作者: 老手    時間: 2010-03-19 22:52
第一題看看林銳高質(zhì)量C/C++編程的附錄B,那里有。
dozec 發(fā)表于 2010-03-19 22:27



沒看過這本書 , 但我猜測那里所講的不會給lz幫上忙.
作者: cjaizss    時間: 2010-03-19 23:15
出題目的人就沒有什么水平,還不如我來教教他怎么出一個有點質(zhì)量的題目
作者: 老手    時間: 2010-03-19 23:20
想聽聽"cjaizss"斑竹高見. 我還準(zhǔn)備抄下來當(dāng)考題呢
作者: cjaizss    時間: 2010-03-19 23:26
想聽聽"cjaizss"斑竹高見. 我還準(zhǔn)備抄下來當(dāng)考題呢
老手 發(fā)表于 2010-03-19 23:20

想抄就抄下來吧,也沒什么.
你想,連++,--的問題都可以上大學(xué)生的教材乃至試卷,還有什么不可能的?
說不定面試者就喜歡問這種垃圾題呢,就算你很鄙視的說些什么,人家也還是判你錯.
只是,我不會問這種問題,永遠(yuǎn)不會問,因為丟臉.
作者: 天使是山東人    時間: 2010-03-19 23:29
本帖最后由 天使是山東人 于 2010-03-20 11:42 編輯

林銳那本書,也就糊弄學(xué)生可以,糊弄開發(fā)者,有點小兒科了吧。。。
再說他說的那是windows下vc++的東西,和unix下的c沒有什么太大關(guān)系。。。

第一道題根本無解,為什么? 因為根據(jù)我的經(jīng)驗,很多判斷條件是隨著每次循環(huán)而不同的,比如你循環(huán)一個數(shù)組,如果當(dāng)前項大于100,然后怎么樣,如果當(dāng)前項小于50,然后怎么樣,,,

至于第二道題目,不知道考官的意思是不是考數(shù)組下標(biāo)的
作者: 老手    時間: 2010-03-19 23:30
回復(fù) 10# cjaizss


    謝謝
作者: bluewaterray    時間: 2010-03-20 09:52
什么題目啊這是。。
作者: gotop167    時間: 2010-03-20 10:49
第一題看看林銳高質(zhì)量C/C++編程的附錄B,那里有。
dozec 發(fā)表于 2010-03-19 22:27



    是的!
作者: moonwhite999    時間: 2010-03-20 11:31
我沒看過林銳的那本書,第一道題晚自己把它想復(fù)雜了,第二道題個人認(rèn)為可以做一做,其實不是那么容易做好的,有很多陷阱
作者: shang2010    時間: 2010-03-20 11:55
for(i=0;i<100;i++)sum+=i;
這樣的代碼,編譯器可以做流水操作的優(yōu)化,

這對性能很重要,如果可能你反問面試官,究竟怎么個優(yōu)化法
作者: 老手    時間: 2010-03-20 12:14
我查到了"標(biāo)準(zhǔn)答案"了,
  1. for (i=0; i<N; i++)
  2. {
  3. if (condition)
  4. DoSomething();
  5. else
  6. DoOtherthing();
  7. }
復(fù)制代碼
優(yōu)點:程序簡潔
缺點:多執(zhí)行了N-1 次邏輯判斷,并且
打斷了循環(huán)“流水線”作業(yè),使得編譯
器不能對循環(huán)進行優(yōu)化處理,降低了效
率。
  1. if (condition)
  2. {
  3. for (i=0; i<N; i++)
  4. DoSomething();
  5. }
  6. else
  7. {
  8. for (i=0; i<N; i++)
  9. DoOtherthing();
  10. }
復(fù)制代碼
優(yōu)點:循環(huán)的效率高
缺點:程序不簡潔

以上是林銳先生給出的解答.這個解答的著眼點在于程序的風(fēng)格及執(zhí)行效率.
林很可能不搞嵌入式,或者僅限于在單進程的情況下討論這個問題.

lz去應(yīng)聘嵌入式,按道理對"實時響應(yīng)"不能不有所考慮 .
假如condition是外界某觸發(fā)信號,你覺得 ,兩種寫法哪一種更好?
如果你給出的是上述標(biāo)準(zhǔn)答案 , 那人家說的沒錯, 你不適合搞嵌入式的.
作者: cjaizss    時間: 2010-03-20 12:39
我查到了"標(biāo)準(zhǔn)答案"了,優(yōu)點:程序簡潔
缺點:多執(zhí)行了N-1 次邏輯判斷,并且
打斷了循環(huán)“流水線”作業(yè),使 ...
老手 發(fā)表于 2010-03-20 12:14



    之所以我覺得第一個想出這個問題的人應(yīng)該覺得臉紅,比如林銳吧。因為這個題目居然把兩種語意完全不同的流程并在一起比較。把這種問題放出來給別人回答,回答者有點水平的都會去懷疑提問者到底懂不懂編程。
   總之,提問者應(yīng)該要覺得丟人才對,否則臉皮厚了點。
作者: nine8    時間: 2010-03-20 13:00
之所以我覺得第一個想出這個問題的人應(yīng)該覺得臉紅,比如林銳吧。因為這個題目居然把兩種語意完全 ...
cjaizss 發(fā)表于 2010-03-20 12:39


原來也遇到過這題

    還請版主再說下,為什么這2種語意完全不同?一起出為什么出題者不懂編程呢?
作者: doofy    時間: 2010-03-20 13:37
想了一下,題目出的是比較牽強:
第一種情況,在循環(huán)過程中,condition會變,也不好寫成第二種形式;
第二種情況,在某一種condition下,執(zhí)行一個循環(huán),也沒必要寫成第一種情況;

所以兩種形式有各自適用的場景,無優(yōu)劣之分!
作者: 老手    時間: 2010-03-20 14:03
之所以我覺得第一個想出這個問題的人應(yīng)該覺得臉紅,比如林銳吧。因為這個題目居然把兩種語意完全 ...
cjaizss 發(fā)表于 2010-03-20 12:39


我看寫書比寫程序更難. 寫書考慮到篇幅 , 限定范圍 , 考慮主次 , 還要通俗易懂, 難啊.
如果林先生只是要闡述某種觀點 , 他完全可以不用像律師那樣加入很多限定詞 .
反而是體理不到他的用意而把它拿出來無限解讀,才是最應(yīng)該臉紅的.


考官可以不臉紅 .
常在河邊走 , 哪有不被bs的?
如果有幸遇到"cjaizss"斑這樣的老手 , 被鄙視一下還是很劃得來的.

實在被bs得不行 , 我建議考官把IQ分占的比例降低 , 把EQ分提高 , 側(cè)重考察溝通交流能力也可以
作者: nine8    時間: 2010-03-20 14:41
第一題,還是沒怎么理解,感覺2種情況是一樣的

condition ---> for   對于硬件 就是 mux + adder (add_logic + register)

for ---> condition 對于硬件 就是 adder(add_logic + mux + register)

感覺是一樣的,不知道區(qū)別在什么地方?還請大家指教
作者: folklore    時間: 2010-03-20 17:26
自己頂一個,第一題我也很想知道答案,望強者不吝賜教
第二題,面試的說我的做法不適用于嵌入式,我本就沒 ...
moonwhite999 發(fā)表于 2010-03-19 22:23



我倒,這兩種寫法的邏輯功能不樣,還能比較么?
作者: jhzhu_snps    時間: 2010-03-20 20:34
for(i=0;i
shang2010 發(fā)表于 2010-03-20 11:55



    這樣的代碼,強一點的編譯器直接就把循環(huán)優(yōu)化沒了。
作者: jhzhu_snps    時間: 2010-03-20 20:39
我查到了"標(biāo)準(zhǔn)答案"了,優(yōu)點:程序簡潔
缺點:多執(zhí)行了N-1 次邏輯判斷,并且
打斷了循環(huán)“流水線”作業(yè),使 ...
老手 發(fā)表于 2010-03-20 12:14



    編譯器只要做循環(huán)不變量的優(yōu)化就應(yīng)該能把這樣的條件語句拿出循環(huán)外了,其實在里面還是外邊也沒什么大的區(qū)別。此外,條件判斷在循環(huán)內(nèi)部,對與有條件預(yù)測的處理器來說也不會對執(zhí)行造成多大的性能影響。
作者: jhzhu_snps    時間: 2010-03-20 20:48
想了一下,題目出的是比較牽強:
第一種情況,在循環(huán)過程中,condition會變,也不好寫成第二種形式;
第二 ...
doofy 發(fā)表于 2010-03-20 13:37



    如果從嵌入式的角度考慮的話,有可能發(fā)生這樣的情況
for(i=1;i<N;i++)
    {
          SS1
           if(condition)
              DoSomeThing;
           else
              DoOtherThing;
          SS2
    }

如果SS1和SS2的代碼量都比較大的話,為了優(yōu)化代碼性能而改寫成
    if(condition)
    {
           for(i=1;i<N;i++){
               SS1
               DoSomeThing;
               SS2
           }
  
    }
    else
    {
          for(i=1;i<N;i++){
              SS1
              DoOtherThing;
              SS2
          }
    }
這樣會大大怎講代碼的長度,鑒于嵌入式系統(tǒng)一般要考慮縮短代碼長度,這種事情還是不要做的好。
作者: jhzhu_snps    時間: 2010-03-20 21:02
想聽聽"cjaizss"斑竹高見. 我還準(zhǔn)備抄下來當(dāng)考題呢
老手 發(fā)表于 2010-03-19 23:20



    一起抄一起抄^_^
作者: doofy    時間: 2010-03-20 21:39
回復(fù) 26# jhzhu_snps


    能不能把判斷拿到循環(huán)外由業(yè)務(wù)邏輯決定,試想下,如果在for()里改變了condition,還能拿到for外面去么?
作者: x2    時間: 2010-03-20 21:58
回復(fù) 1# moonwhite999


題1:
代碼1:在N次循環(huán)中,如果condition為真,DoSomeThing, 否則DoOtherThing;
代碼2:如果condition為真,DoSomeThing N次,否則DoOtherThing N次。
作者: pppStar    時間: 2010-03-20 22:11
第一題沒啥意思

第二題
#include<stdio.h>
#include<string.h>

static char getfirst(const char *str, int len)
{
    int num[26] = {0};
    int order[26] = {0};
    int i = 0;
    int minorder = 26;

    for(i=0;i<len;i++)
    {
        num[str[i]-'a']++;
        order[str[i]-'a'] = i;
    }   
   
    for(i=0;i<26;i++)
    {
        if(num[i]==1)
        {   
            if(order[i] < minorder)
            {
                minorder = order[i];
            }
        }
    }
    if(minorder == 26)
    {
        return 0;
    }
    else
    {   
        return str[minorder];
    }  
}

int main()
{
    char *s="aasiosffsafgdggsfasaurefhkfhaa";
    printf("%c\n",getfirst(s, strlen(s)));   
    return 0;
}
作者: wqf2    時間: 2010-03-21 14:58
當(dāng)條件與i相關(guān),就用第一個。否則用第二個。
作者: etoux    時間: 2010-03-21 15:07
想抄就抄下來吧,也沒什么.
你想,連++,--的問題都可以上大學(xué)生的教材乃至試卷,還有什么不可能的?
說不定 ...
cjaizss 發(fā)表于 2010-03-19 23:26


仰望高人
作者: moonwhite999    時間: 2010-03-21 21:31
第二道題貼上我的程序吧,已調(diào)試通過的,我知道在大牛眼里不屑一顧,但我剛工作時得到很多不認(rèn)識的人的幫助,現(xiàn)在還常懷感激,我也深知對一些人很簡單的問題,在另一些人那里則很困難,因為我也是從那個階段過來的。
#include <stdio.h>
#include <string.h>

int nCharHash[26];

int FindOnceChar( char *strsrc,char &c,int &ipos)
{
        int nLen = strlen(strsrc);
        int i;
        for ( i = 0;i < nLen;i++)
        {
                nCharHash[strsrc[i]-'a']++;
        }
        for ( i = 0;i < nLen;i++)
        {
                if ( 1 == nCharHash[strsrc[i]-'a'] )
                {
                        c = strsrc[i];
                        ipos = i;
                        break;
                }
        }
        if ( i == nLen)
        {
                return -1;
        }
    return  0;
}

int main()
{
        char *testchar = "abcdabce";
        char c;
        int nPos;
        int nRet;
        nRet = FindOnceChar(testchar,c,nPos);
        if ( 0 == nRet )
        {
                printf( "The char Which placed only once is %c,the position is %d\n",c,nPos);
        }
        return 0;

}

第一道題大家不必再費腦筋了,因為我沒有做過嵌入式開發(fā),我還以為是后臺的無限循環(huán)程序可以處理中斷的,沒想到看到答案真讓我大跌眼鏡,這家公司看來我也不必去了。
作者: dooros    時間: 2010-03-21 22:18
學(xué)習(xí)了。
作者: xs3c    時間: 2010-03-22 08:29
回復(fù) 7# 老手


    里面講的好像也是一些優(yōu)化,第二個要比第一個效率高寫,不用每次循環(huán)的時候,都去判斷。
作者: pengjianbokobe    時間: 2010-03-22 09:56
回復(fù) 33# moonwhite999


    同學(xué),你這代碼寫的亂啊。。。   局部變量也沒初始化,找到的也不是第一個唯一出現(xiàn)的字母,很不規(guī)范啊。。
作者: 老手    時間: 2010-03-22 12:23
第二道題貼上我的程序吧,已調(diào)試通過的,我知道在大牛眼里不屑一顧,但我剛工作時得到很多不認(rèn)識的人的幫助 ...
moonwhite999 發(fā)表于 2010-03-21 21:31



設(shè)計思路上, 你做了2個假設(shè):

1. 字符串中都是英文字母,且都是小寫的.
2. 字符串里符合要求的情況要么沒有,要么只會有一次..


你很認(rèn)真.
可以訓(xùn)練一段時間,再上沙場.
作者: jhzhu_snps    時間: 2010-03-22 13:09
回復(fù)  jhzhu_snps


    能不能把判斷拿到循環(huán)外由業(yè)務(wù)邏輯決定,試想下,如果在for()里改變了condit ...
doofy 發(fā)表于 2010-03-20 21:39



    既然出了這樣的題,就假設(shè)這個condition是循環(huán)不變量好了。問題就變成關(guān)于循環(huán)不變量的控制流分析及優(yōu)化的作用和影響,所以我覺得答案應(yīng)該是:
    1. 外提循環(huán)不變量能提高代碼的執(zhí)行效率
   2. 在硬件提供強大的分支預(yù)測的優(yōu)化功能時,外提循環(huán)不變量的優(yōu)化效果有限
   3. 外提在控制語句中所使用的循環(huán)不變量會導(dǎo)致代碼膨脹,可能不適用于嵌入式應(yīng)用。
作者: 專操五毛    時間: 2010-03-22 14:25
回復(fù) 33# moonwhite999


    樓主我也寫了個,和你思路一樣。只是簡化了一些,希望能有幫助。

  1. #include <stdio.h>
  2. #include <limits.h>

  3. char* find_first_once(char* s)
  4. {
  5.         int map[UCHAR_MAX] = {0};
  6.         char *tmp = s;
  7.         while (*tmp)
  8.                 ++map[*tmp++];
  9.         while (*s)
  10.                 if (1 == map[*s])
  11.                         return s;
  12.                 else
  13.                         s++;
  14.         return NULL;
  15. }

  16. int main(int argc, char* argv[])
  17. {
  18.         char *s = "abcdabce";
  19.         char *p = find_first_once(s);
  20.         if (p)
  21.         {
  22.                 printf("%c:%d\n", *p, p-s);
  23.         }
  24.         else
  25.         {
  26.                 printf("none!\n");
  27.         }
  28.         return 0;
  29. }
復(fù)制代碼

作者: bxfqing    時間: 2010-03-22 14:46
shun shou xie le ge

  1. int find(char * str)
  2. {
  3.         int ii,var,len;
  4.         len=strlen(str);
  5.         for(ii=0;ii<len;ii++)
  6.         {
  7.                 char b= str[ii];
  8.                 int jj;
  9.                 for(jj=0;jj<len;jj++)
  10.                 {
  11.                         if (b == str[jj] && jj !=ii)
  12.                         break;
  13.                 }
  14.                 if(jj == len)
  15.                 {
  16.                         printf("%c:pos:%d\n",str[ii],ii);
  17.                         break;
  18.                 }
  19.         }
  20. }
  21. void main()
  22. {
  23.         char strin[]="abcdabce";
  24.         find(strin);
  25. }
復(fù)制代碼

result:
XX@XX:/opt/$ ./a.out
d:pos:3

作者: angele25e    時間: 2010-03-22 14:49
回復(fù) 39# 專操五毛


    您的編程風(fēng)格很規(guī)范,膜拜!
作者: 專操五毛    時間: 2010-03-22 15:53
實在過獎了。
匆匆寫就,不規(guī)范的有好幾處,自己review了下。
1. 函數(shù)申明沒用const
2. 副作用++用的太濫
3. 分支語句沒用{和}包起來
4. 最重要的的是,函數(shù)中用了多次return(這非常不好)

一句話,寫代碼時態(tài)度不好。
作者: angele25e    時間: 2010-03-22 16:10
回復(fù) 42# 專操五毛


    呵呵,再次學(xué)習(xí)!
作者: doofy    時間: 2010-03-22 16:13
回復(fù) 39# 專操五毛

表驅(qū)動的一個簡單例子,贊一下代碼的簡練!
作者: samlumengjun    時間: 2010-03-22 16:45
也來獻丑一下,適合所有字符的版本
int main( int argc, char **argv )
{
                unsigned char a[255], min_c, found=0;
        int i, len, t, p, min;
        min = len = strlen(argv[1]);
        memset( a, 0, 255 );
        for( i=0; i<len; i++ )
        {
                if( !a[argv[1][i]] )
                        a[argv[1][i]] = 1 + (i+1)*10;
                else
                        a[argv[1][i]] = 2 + (i+1)*10;
        }
        for( i=0; i<255; i++ )
        {
                t = a[i]/10;
                p = a[i]%10;
                if( p == 1 )
                {
                        if( t<min )
                        {
                                min = t;
                                min_c = i;
                                found = 1;
                        }
                }
        }
                       
        if( found )
                printf( "%c: %d\n", min_c, min );
        else
                printf( "Not found!\n" );
}
作者: linuxIsPerfect    時間: 2010-03-22 17:46
實在過獎了。
匆匆寫就,不規(guī)范的有好幾處,自己review了下。
1. 函數(shù)申明沒用const
2. 副作用++用的太濫 ...
專操五毛 發(fā)表于 2010-03-22 15:53



    估計他是華三的。。。

    這樣效率高嗎? 難看死了,看不懂。  不過還是學(xué)習(xí)
作者: pengjianbokobe    時間: 2010-03-22 19:26
回復(fù) 42# 專操五毛


    請問,為什么多次返回return不好?怎樣返回好呢?

作者: 專操五毛    時間: 2010-03-22 19:42
回復(fù) 47# pengjianbokobe


    因為如果在函數(shù)體中申請了資源,多處return可能造成資源泄露。所以很多編程規(guī)范都強調(diào)在函數(shù)末尾用返回值返回。比如可以用break或goto到達(dá)函數(shù)尾。

代碼改了改,這樣做code review時候應(yīng)該會好不少

  1. #include <limits.h>

  2. const char* find_first_once(const char* s)
  3. {
  4.         int map[UCHAR_MAX] = {0};
  5.         const char *ptr = s;
  6.         while (*ptr)
  7.         {
  8.                 map[*ptr]++;
  9.                 ptr++;
  10.         }

  11.         ptr = NULL;
  12.         while (*s)
  13.         {
  14.                 if (1 == map[*s])
  15.                 {
  16.                         ptr = s;
  17.                         break;
  18.                 }
  19.                 else
  20.                 {
  21.                         s++;
  22.                 }
  23.         }
  24.         return ptr;
  25. }

  26. int main(int argc, char* argv[])
  27. {
  28.         const char *s = "abcdabce";
  29.         const char *p = find_first_once(s);
  30.         if (p)
  31.         {
  32.                 printf("%c:%d\n", *p, p-s);
  33.         }
  34.         else
  35.         {
  36.                 printf("none!\n");
  37.         }
  38.         return 0;
  39. }
復(fù)制代碼

作者: yubinwu    時間: 2010-03-23 11:09
效率了
作者: Deng5    時間: 2010-03-23 11:11
我是從局部性來看待這個問題的。第二個程序的空間局部性比第一個好,所以效率高一些。
作者: davycu    時間: 2010-03-23 11:26
感覺是靠應(yīng)屆生的題目,樓主偶猜的對嗎?
作者: dongchenghuozi    時間: 2010-03-23 16:23
回復(fù) 1# moonwhite999


    至于第一個問題,先不考慮編譯器的原因,在這種情況下前一種方式相對優(yōu)化,至于原因就是對if(·····)的判斷次數(shù)。

如果考慮到編譯器,就無話可說了。每個編譯器都不一樣,以后發(fā)展了說不定在頭上插兩個電線。電腦就能編程呢。

第二個問題,可以設(shè)置一個1維數(shù)組,具體要看字符種類有多少。如果是26個字母的話,就設(shè)置A[26]夠了。初始化數(shù)據(jù)A[]=27
從字符串末尾掃描,遇到一個字符串如果它在數(shù)組中對應(yīng)數(shù)值不是27話,說明該字符已經(jīng)多次出現(xiàn)不用理會,否則就在數(shù)組多對應(yīng)位置填入該字符在字符串中的位置數(shù)字。

一輪掃描結(jié)束后,每個字符具體在字符串中的位置信息已經(jīng)記錄在數(shù)組中了。只要判斷數(shù)組特征就可以知道答案。
作者: wangfei775    時間: 2010-03-23 16:33
哈哈,很早的東西了,
作者: 松餅熊    時間: 2010-03-24 13:00
說到嵌入式我以為我會看到
編碼規(guī)則
變量對齊
端口映射地址讀取方法
任務(wù)優(yōu)先級與中斷引起的內(nèi)存鎖
之類的題目。

可是我卻還是看到了這些計算機競賽初級班的題目。
作者: linuxIsPerfect    時間: 2010-03-24 13:09
回復(fù) 48# 專操五毛

學(xué)習(xí)學(xué)習(xí),繼續(xù)學(xué)習(xí)。。。
作者: zhouweiz    時間: 2010-03-29 16:50
個人認(rèn)為,面試官最好多問解決問題的思路上的東西,比如從什么地方入手,思想方法。不要扣住一些知識細(xì)節(jié)問到底。所有的實現(xiàn)都是由應(yīng)用引發(fā)的。比如 一般情況下創(chuàng)建子進程回拷貝父進程頁面,但是在沒有MMU的uClinux下為了節(jié)省時間,父子進程是共享頁面的。只要解決問題思路對,就行了。
作者: lyscsu    時間: 2010-03-30 14:52
本帖最后由 lyscsu 于 2010-03-30 14:57 編輯

第一道題
1、業(yè)務(wù)邏輯:看i是否影響condition的計算,同時看分支是否改變i的值
2、性能和空間要求
第二道題
使用glibc函數(shù)
char find_first_once_char(char * s)
{
        if(!s)
        {
                return 0;
        }

        while(*s)
        {
                if(!strchr(s+1, *s))
                {
                        break;
                }

                s++;
        }

        return *s
}

不使用glibc函數(shù)
char find_first_once_char(char * s)
{
        if(!s)
        {
                return 0;
        }
       
        while(*s)
        {
                char * p = s+1;

                while(*p && (*p!=*s))
                {
                        p++;
                }

                if(*p)
                {
                        s++;
                }
                else
                {
                        break;
                }
        }

        return *s
}
作者: kris_fei    時間: 2010-06-24 00:56
學(xué)習(xí)了
作者: system888net    時間: 2010-06-24 01:22
int condition;

void DoSomeThing()
{
   return;
}

void DoOtherThing()
{
   return;
}

int fun1(int N)
{
   int i;
   for(i=1;i<N;i++)
    {
           if(condition)
              DoSomeThing();
           else
              DoOtherThing();
    }
    return(i);
}
int fun2(int N)
{
    int i;
    if(condition)
    {
          for(i=1;i<N;i++)
               DoSomeThing();
    }
    else
    {
          for(i=1;i<N;i++)
              DoOtherThing();
    }
   return(i);
}

int main()
{
   
   fun1(100);
   fun2(100);
   return(0);
}
作者: system888net    時間: 2010-06-24 01:24
output: arm asm


        .file        "test_arm.c"
        .text
        .align        2
        .global        DoSomeThing
        .type        DoSomeThing, %function
DoSomeThing:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args = 0
        mov        ip, sp
        stmfd        sp!, {fp, ip, lr, pc}
        sub        fp, ip, #4
        ldmfd        sp, {fp, sp, pc}
        .size        DoSomeThing, .-DoSomeThing
        .align        2
        .global        DoOtherThing
        .type        DoOtherThing, %function
DoOtherThing:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args = 0
        mov        ip, sp
        stmfd        sp!, {fp, ip, lr, pc}
        sub        fp, ip, #4
        ldmfd        sp, {fp, sp, pc}
        .size        DoOtherThing, .-DoOtherThing
        .align        2
        .global        fun1
        .type        fun1, %function
fun1:
        @ args = 0, pretend = 0, frame = 8
        @ frame_needed = 1, uses_anonymous_args = 0
        mov        ip, sp
        stmfd        sp!, {fp, ip, lr, pc}
        sub        fp, ip, #4
        sub        sp, sp, #8
        str        r0, [fp, #-16]
        mov        r3, #1
        str        r3, [fp, #-20]
.L4:
        ldr        r2, [fp, #-20]
        ldr        r3, [fp, #-16]
        cmp        r2, r3
        bge        .L5
        ldr        r3, .L9
        ldr        r3, [r3, #0]
        cmp        r3, #0
        beq        .L7
        bl        DoSomeThing
        b        .L6
.L7:
        bl        DoOtherThing
.L6:
        ldr        r3, [fp, #-20]
        add        r3, r3, #1
        str        r3, [fp, #-20]
        b        .L4
.L5:
        ldr        r3, [fp, #-20]
        mov        r0, r3
        sub        sp, fp, #12
        ldmfd        sp, {fp, sp, pc}
.L10:
        .align        2
.L9:
        .word        condition
        .size        fun1, .-fun1
        .align        2
        .global        fun2
        .type        fun2, %function
fun2:
        @ args = 0, pretend = 0, frame = 8
        @ frame_needed = 1, uses_anonymous_args = 0
        mov        ip, sp
        stmfd        sp!, {fp, ip, lr, pc}
        sub        fp, ip, #4
        sub        sp, sp, #8
        str        r0, [fp, #-16]
        ldr        r3, .L20
        ldr        r3, [r3, #0]
        cmp        r3, #0
        beq        .L12
        mov        r3, #1
        str        r3, [fp, #-20]
.L13:
        ldr        r2, [fp, #-20]
        ldr        r3, [fp, #-16]
        cmp        r2, r3
        bge        .L16
        bl        DoSomeThing
        ldr        r3, [fp, #-20]
        add        r3, r3, #1
        str        r3, [fp, #-20]
        b        .L13
.L12:
        mov        r3, #1
        str        r3, [fp, #-20]
.L17:
        ldr        r2, [fp, #-20]
        ldr        r3, [fp, #-16]
        cmp        r2, r3
        bge        .L16
        bl        DoOtherThing
        ldr        r3, [fp, #-20]
        add        r3, r3, #1
        str        r3, [fp, #-20]
        b        .L17
.L16:
        ldr        r3, [fp, #-20]
        mov        r0, r3
        sub        sp, fp, #12
        ldmfd        sp, {fp, sp, pc}
.L21:
        .align        2
.L20:
        .word        condition
        .size        fun2, .-fun2
        .align        2
        .global        main
        .type        main, %function
main:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args = 0
        mov        ip, sp
        stmfd        sp!, {fp, ip, lr, pc}
        sub        fp, ip, #4
        mov        r0, #100
        bl        fun1
        mov        r0, #100
        bl        fun2
        mov        r3, #0
        mov        r0, r3
        ldmfd        sp, {fp, sp, pc}
        .size        main, .-main
        .comm        condition,4,4
        .ident        "GCC: (GNU) 3.4.4"
作者: system888net    時間: 2010-06-24 01:25
詳見fun1,fun2




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2