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

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

嵌入式開發(fā)工程師面試題1

11/25 09:50
918
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

1.若有以下定義語(yǔ)句double a[8],*p=a;int i=5;對(duì)數(shù)組元素錯(cuò)誤的引用是?

A?*a

B?a[5]

C?*(p+1)

D?p[8]

在 C 或 C++ 語(yǔ)言中,對(duì)于數(shù)組和指針的操作需要嚴(yán)格遵守語(yǔ)法規(guī)則。

我們逐一分析選項(xiàng)來確定哪個(gè)是對(duì)數(shù)組元素錯(cuò)誤的引用:A.?*a

這是正確的。a?是數(shù)組名,它在大多數(shù)表達(dá)式中等價(jià)于指向數(shù)組第一個(gè)元素的指針。因此,*a?等價(jià)于?a[0],表示數(shù)組的第一個(gè)元素。

B.?a[5]

這也是正確的。a[5]?直接引用數(shù)組的第六個(gè)元素(數(shù)組索引從 0 開始)。

C.?*(p+1)

這同樣是正確的。p?是一個(gè)指向?double?類型的指針,指向數(shù)組?a?的第一個(gè)元素。p+1?將指針移動(dòng)到數(shù)組的第二個(gè)元素,*(p+1)?解引用這個(gè)指針,得到數(shù)組的第二個(gè)元素,即?a[1]。

D.?p[8]

這是錯(cuò)誤的。在 C/C++ 中,p[i]?是指針?p?偏移?i?個(gè)元素后的值的簡(jiǎn)寫,等價(jià)于?*(p+i)。因此,p[8]?等價(jià)于?*(p+8),這意味著嘗試訪問?p?指向的位置之后的第九個(gè)?double?元素。由于?p?指向的是一個(gè)只有 8 個(gè)元素的數(shù)組,p[8]?嘗試訪問數(shù)組之外的內(nèi)存,這是越界的,因此是錯(cuò)誤的。

綜上所述,錯(cuò)誤的引用是?D. p[8]。

2.在上下文及頭文件均正常的情況下,設(shè):

enum color { red, yellow = 2, blue, white, black }r = white;

,執(zhí)行 printf("%d", r) ;后的輸出結(jié)果是?

在C語(yǔ)言中,enum類型用于定義一組命名的整數(shù)常量。當(dāng)定義enum時(shí),可以給枚舉成員顯式賦值,也可以不賦值。如果未顯式賦值,則枚舉成員的值將默認(rèn)為前一個(gè)成員的值加1(第一個(gè)未賦值的成員默認(rèn)為0)。

考慮以下enum定義:c

復(fù)制代碼

enum color { red, yellow = 2, blue, white, black } r = white;

 

這里,enum color定義了五個(gè)成員:

red:未顯式賦值,且是第一個(gè)成員,因此默認(rèn)為0。

yellow:顯式賦值為2。

blue:未顯式賦值,因此繼承

yellow的值加1,即3。

white:未顯式賦值,因此繼承

blue的值加1,即4。

black:未顯式賦值,因此繼承

white的值加1,即5。

同時(shí),定義了一個(gè)enum color類型的變量r,并將其初始化為white。由于white的值是4,因此執(zhí)行printf("%d", r);后,輸出結(jié)果是4??偨Y(jié):執(zhí)行printf("%d", r);后的輸出結(jié)果是4。

3.對(duì)于條件表達(dá)式(k)?(i++):(i--)來說,其中的表達(dá)式k等價(jià)于()

A?k==0B?k==1C?k!=0D?k!=1

在C語(yǔ)言中,條件表達(dá)式(也稱為三元運(yùn)算符)的語(yǔ)法是:

復(fù)制代碼

condition ? expression1 : expression2;

這里,condition?是一個(gè)任意表達(dá)式,它會(huì)被評(píng)估為真(非零)或假(零)。如果?condition?為真(即非零),則整個(gè)條件表達(dá)式的結(jié)果是?expression1?的值;如果?condition?為假(即零),則結(jié)果是?expression2?的值?,F(xiàn)在考慮給定的條件表達(dá)式:

代碼

(k) ? (i++) : (i--);

在這個(gè)表達(dá)式中,k?是條件部分。根據(jù)條件表達(dá)式的規(guī)則,k?會(huì)被評(píng)估:如果 k 的值非零(即真),則執(zhí)行 i++。如果 k?的值為零(即假),則執(zhí)行 i--。

這里的關(guān)鍵是理解?k?如何被評(píng)估。在C語(yǔ)言中,任何非零值都被視為真,而零被視為假。因此,當(dāng)?k?被用作條件時(shí),它實(shí)際上是在檢查?k?是否不等于零。

現(xiàn)在來看選項(xiàng):A.?k==0:這是檢查?k?是否等于零,與條件表達(dá)式的邏輯不符。B.?k==1:這是檢查?k?是否等于1,這同樣不是條件表達(dá)式所檢查的。C.?k!=0:這是檢查?k?是否不等于零,這與條件表達(dá)式中?k?的評(píng)估方式相符。D.?k!=1:這是檢查?k?是否不等于1,這也不是條件表達(dá)式所檢查的。

因此,對(duì)于條件表達(dá)式?(k) ? (i++) : (i--)?來說,其中的表達(dá)式?k?等價(jià)于?k!=0。正確答案是 C。

4.設(shè)有以下函數(shù)void fun(int n,char *s)(......),則下面對(duì)函數(shù)指針的定義和賦值均是正確的:()

A?void (*pf)(int,char); pf=&fun;B?void (*pf)(int n,char *s); pf=fun;C?void *pf(); *pf=fun;D?void *pf(); pf=fun;

在C語(yǔ)言中,定義一個(gè)指向函數(shù)的指針需要指定函數(shù)的返回類型、函數(shù)名(在指針定義中省略)以及函數(shù)的參數(shù)類型。對(duì)于給定的函數(shù):

復(fù)制代碼

void fun(int n, char *s);

我們需要定義一個(gè)函數(shù)指針,該指針能夠指向這樣一個(gè)函數(shù):返回類型為void,接受一個(gè)int類型的參數(shù)和一個(gè)char *類型的參數(shù)?,F(xiàn)在,我們逐一分析選項(xiàng):A.?void (*pf)(int,char); pf=&fun;

這個(gè)選項(xiàng)中的函數(shù)指針定義是錯(cuò)誤的。它應(yīng)該指定第二個(gè)參數(shù)為char *類型,而不是char類型。此外,雖然取函數(shù)地址是常見的做法,但在這個(gè)上下文中,直接賦值pf = fun;也是合法的,因?yàn)楹瘮?shù)名在大多數(shù)表達(dá)式中會(huì)被解釋為指向該函數(shù)的指針。

B.?void (*pf)(int n,char *s); pf=fun;

這個(gè)選項(xiàng)是正確的。函數(shù)指針pf被正確地定義為指向一個(gè)接受int和char *參數(shù)并返回void的函數(shù)。然后,pf被賦值為fun,這是合法的,因?yàn)閒un是一個(gè)符合該簽名的函數(shù)。

C.?void *pf(); *pf=fun;

D.?void *pf(); pf=fun;

這個(gè)選項(xiàng)同樣是錯(cuò)誤的。與選項(xiàng)C類似,pf的定義與fun的簽名不匹配。此外,嘗試將函數(shù)名fun直接賦值給pf也是不正確的,因?yàn)轭愋筒黄ヅ洹?/p>

綜上所述,只有選項(xiàng)B正確地定義了函數(shù)指針,并將其賦值為指向給定函數(shù)的指針。正確答案是B:

5.閱讀下面代碼:

class B{public:   virtual void Fun(){}};class D: public B{public:   void Fun(){}};D dd;B* pb = ⅆD* pd = ⅆpb->Fun();pd->Fun();

上述例程調(diào)用的Fun函數(shù)順序?yàn)椋ǎ?/strong>A?B::Fun, D::FunB?B::Fun, B::FunC?D::Fun, D::FunD?D::Fun, B::Fun

在C++中,虛函數(shù)(virtual function)機(jī)制允許派生類(derived class)重寫(override)基類(base class)中的函數(shù)。當(dāng)通過基類指針或引用調(diào)用虛函數(shù)時(shí),實(shí)際調(diào)用的函數(shù)是派生類中重寫的那個(gè)版本,而不是基類中的版本。

這種動(dòng)態(tài)綁定(dynamic binding)或稱為運(yùn)行時(shí)多態(tài)性(runtime polymorphism)是面向?qū)ο缶幊讨械囊粋€(gè)核心概念。現(xiàn)在,我們來分析提供的代碼:c復(fù)制代

class B 定義了一個(gè)虛函數(shù)?Fun()class D 繼承自?B 并重寫了?Fun() 函數(shù)。創(chuàng)建了一個(gè)?D 類型的對(duì)象?dd。

B* pb = ⅆ

創(chuàng)建了一個(gè)指向 dd 的 B 類型的指針 pb。由于 B 中的 Fun() 是虛函數(shù),通過 pb 調(diào)用 Fun() 時(shí),將發(fā)生動(dòng)態(tài)綁定,實(shí)際調(diào)用的是 D?類中的 Fun().

D* pd = ⅆ 創(chuàng)建了一個(gè)指向?dd?的 D 類型的指針 pd。通過 pd 調(diào)用 Fun() 時(shí),直接調(diào)用的是 D?類中的 Fun(),因?yàn)檫@里沒有涉及多態(tài)性(即沒有通過基類指針調(diào)用派生類函數(shù))。

現(xiàn)在,我們來看函數(shù)調(diào)用的順序:

pb->Fun();:由于?pb 是 B 類型的指針,但指向 D 類型的對(duì)象,且 Fun() 是虛函數(shù),因此這里調(diào)用的是 D::Fun()。

pd->Fun();:pd 是 D 類型的指針,直接指向 D?類型的對(duì)象,因此這里調(diào)用的也是 D::Fun().

綜上所述,調(diào)用的?Fun?函數(shù)順序?yàn)?D::Fun, D::Fun正確答案是 C。

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

相關(guān)推薦

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