加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

嵌入式工程師面試題

11/20 09:35
730
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

1.以下敘述中正確的是()

A?程序必須包含所有三種基本結(jié)構(gòu)才能成為一種算法

B?我們所寫的每條C語句,經(jīng)過編譯最終都將轉(zhuǎn)換成二進(jìn)制的機器指令

C?如果算法非常復(fù)雜,則需要使用三種基本結(jié)構(gòu)之外的語句結(jié)構(gòu),才能準(zhǔn)確表達(dá)

D?只有簡單算法才能在有限的操作步驟之后結(jié)束

解析:

正確的敘述是:

A. 錯誤。算法不一定需要包含所有三種基本結(jié)構(gòu)(順序、選擇、循環(huán))才能成為一種算法。算法可以只使用其中一種或兩種結(jié)構(gòu)。

B. 正確。C語言編寫的源代碼經(jīng)過編譯器編譯后,最終會轉(zhuǎn)換成二進(jìn)制的機器指令,這些指令可以被計算機硬件直接執(zhí)行。

C. 錯誤。算法的復(fù)雜性與是否需要使用三種基本結(jié)構(gòu)之外的語句結(jié)構(gòu)沒有必然聯(lián)系。即使是非常復(fù)雜的算法,也可以使用順序、選擇、循環(huán)這三種基本結(jié)構(gòu)來表達(dá)。

D. 錯誤。算法的簡單性與是否能在有限的操作步驟之后結(jié)束沒有必然聯(lián)系。即使是復(fù)雜算法,只要設(shè)計得當(dāng),也能在有限的操作步驟之后結(jié)束。相反,一些看似簡單的算法(如無限循環(huán)),也可能無法在有限的操作步驟之后結(jié)束。

2.a->b的等效寫法是()

A?(*a).b

B?a.(*b)

C?a.b

D?都不是

解析:

這題考察的是C語言中結(jié)構(gòu)體指針訪問成員的問題。

現(xiàn)在來分析每個選項:

A.?(*a).b
這是正確的寫法。*a是對指針a進(jìn)行解引用,得到它所指向的結(jié)構(gòu)體。然后.b是訪問該結(jié)構(gòu)體的成員b。所以(*a).b是有效的,并且與a->b等效。

B.?a.(*b)
這是錯誤的寫法。在C語言中,->運算符是專門用于結(jié)構(gòu)體指針來訪問其成員的。.(*b)這種寫法在C語言中是不合法的。

C.?a.b
這也是錯誤的寫法。a.b用于直接訪問結(jié)構(gòu)體的成員,但在這里a是一個指針,不是結(jié)構(gòu)體本身。所以我們應(yīng)該使用*a來得到結(jié)構(gòu)體,然后再訪問成員b,或者使用a->b這種簡化寫法。

D. 都不是
由于A選項是正確的,所以這個選項自然就是錯誤的。

3.C 語言中,假設(shè)變量說明為:int k=1;?則語句運算完后,k的值是?

k--|| k, k++;

解析:

這題考察的是C語言操作符,它們的優(yōu)先級和結(jié)合性會影響表達(dá)式的求值順序。

--?和?++?是后綴遞減和遞增操作符。當(dāng)它們作為后綴使用時,表達(dá)式的值是在變量改變之前的值。

||?是邏輯或操作符,它會在其左側(cè)表達(dá)式為真時立即返回真,而不計算右側(cè)表達(dá)式(這稱為短路求值)。

,?是逗號操作符,它會順序地計算其左右兩側(cè)的表達(dá)式,并丟棄左側(cè)表達(dá)式的值,整個表達(dá)式的值是右側(cè)表達(dá)式的值。

現(xiàn)在,讓我們分析表達(dá)式?k--||k, k++

初始時,k?的值是 1。

表達(dá)式?k--||k?被計算。首先計算?k--,這是一個后綴遞減操作,所以它會返回?k?遞減之前的值(即 1),然后將?k?減 1。此時,k?變成了 0,但表達(dá)式?k--?的結(jié)果是 1(遞減之前的值)。

接下來計算邏輯或?||。由于?k--?的結(jié)果是 1(真),邏輯或操作符會短路,即不再計算其右側(cè)的表達(dá)式(這里的右側(cè)表達(dá)式是?k,但此時不會被計算)。

逗號操作符?,?然后被計算。它順序地計算其左右兩側(cè)的表達(dá)式,但只返回右側(cè)表達(dá)式的值。在這里,左側(cè)表達(dá)式?k--||k?已經(jīng)計算完畢,其值為 1(但這個值被丟棄了),然后計算右側(cè)表達(dá)式?k++。

計算?k++,這是一個后綴遞增操作。它會返回?k?遞增之前的值(即 0),然后將?k?加 1。所以,k++?的結(jié)果是 0,并且這個值是整個表達(dá)式?k--||k, k++?的結(jié)果。

最終,k?的值被遞增到了 1(但由于逗號操作符的特性,這個遞增后的值不會被用作表達(dá)式的最終結(jié)果)。

綜上所述,表達(dá)式?k--||k, k++?計算完畢后,整個表達(dá)式的值是 0(這是由逗號操作符右側(cè)的?k++?表達(dá)式?jīng)Q定的),而變量?k?的最終值是 1(因為它在表達(dá)式中被遞減然后又遞增了)。所以,問題是詢問?k?的值,答案是 1。

4.有如下一段程序:以下語句合法的是()

int f1(float);int f2(char);void f3(float);int (*pf)(float);

A?int (*p)(float)=&f1;

B?pf=&f2;

C?pf=&f3;

D?pf=f3;

解析:

這是一道關(guān)于C語言中函數(shù)指針的問題。首先,我們需要理解函數(shù)指針的聲明和賦值規(guī)則。

int f1(float);?聲明了一個接受float類型參數(shù)并返回int類型結(jié)果的函數(shù)f1。

int f2(char);?聲明了一個接受char類型參數(shù)并返回int類型結(jié)果的函數(shù)f2

void f3(float);?聲明了一個接受float類型參數(shù)但不返回任何結(jié)果的函數(shù)f3。

int (*pf)(float);?聲明了一個函數(shù)指針pf,它可以指向一個接受float類型參數(shù)并返回int類型結(jié)果的函數(shù)。

接下來,我們逐一分析選項:

A.?int (*p)(float)=&f1;
這是正確的。這里聲明了一個函數(shù)指針p,它指向一個接受float類型參數(shù)并返回int類型結(jié)果的函數(shù),然后將f1的地址賦給了p。這與pf的聲明和賦值是兼容的。

B.?pf=&f2;
這是錯誤的。f2是一個接受char類型參數(shù)的函數(shù),而pf是一個指向接受float類型參數(shù)的函數(shù)的指針。類型不匹配,因此不能賦值。

C.?pf=&f3;
這也是錯誤的。f3是一個不返回任何結(jié)果的函數(shù)(返回類型為void),而pf是一個指向返回int類型結(jié)果的函數(shù)的指針。同樣,類型不匹配,因此不能賦值。

D.?pf=f3;
這同樣是錯誤的。這里嘗試將函數(shù)f3的地址直接賦給函數(shù)指針pf,但由于f3的返回類型與pf所指向的函數(shù)返回類型不匹配(void?vs?int),因此這是不合法的。

綜上所述,只有選項A是合法的語句。它正確地聲明了一個與f1兼容的函數(shù)指針,并將f1的地址賦給了該函數(shù)指針。所以正確答案是A。


未完待續(xù),持續(xù)更新!以防后邊找不到可以點贊收藏下!

相關(guān)推薦

電子產(chǎn)業(yè)圖譜