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ù)更新!以防后邊找不到可以點贊收藏下!