1.若有以下定義語句double a[8],*p=a;int i=5;對(duì)數(shù)組元素錯(cuò)誤的引用是?
A?*a
B?a[5]
C?*(p+1)
D?p[8]
解析:
在 C 或 C++ 語言中,對(duì)于數(shù)組和指針的操作需要嚴(yán)格遵守語法規(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à)于?*(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語言中,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語言中,條件表達(dá)式(也稱為三元運(yùn)算符)的語法是:
復(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語言中,任何非零值都被視為真,而零被視為假。因此,當(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語言中,定義一個(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)贊收藏下!