C語言編程:十例奪命題,為啥C語言的總是這么惡趣味?
有效的C編程需要對諸如未定義的行為,遞歸和指針?biāo)阈g(shù)等概念有深入的理解,但是這些故意復(fù)雜的例子并不代表現(xiàn)實(shí)世界的代碼,在這些問題上的表現(xiàn)不是一個更好的軟件開發(fā)能力指標(biāo)。因此,他們不太可能在面試環(huán)境中有用。(學(xué)校貌似就喜歡做這樣的事情,哈哈)。

主要內(nèi)容
如果你是大學(xué)生,保證這道題你就會喪命,不是咱危言聳聽。
1.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:5
該setjmp函數(shù)存儲“非本地goto”的上下文信息,返回0.該longjmp函數(shù)將控制轉(zhuǎn)移到已setjmp初始化的調(diào)用buf,并且從這一點(diǎn)繼續(xù)執(zhí)行,就好像setjmp返回了1。
注意:之后被修改的非易失性自動變量setjmp變得不確定longjmp。沒有volatile限定詞,這個程序的行為將是不確定的。這個規(guī)則允許更好的代碼優(yōu)化。
好了接著給你來點(diǎn)接地氣的題吧,如果你結(jié)構(gòu)體學(xué)的不錯,我想這題應(yīng)該沒什么難度
2.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:3
struct 的成員按順序排列在記憶中。如果指向a的指針轉(zhuǎn)換struct為指向其第一個成員的指針的類型,則結(jié)果指向其第一個成員。
3.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:2 5
既然a有類型數(shù)組[5]了,int,&a就有類型指針數(shù)組[5]了int。因此&a + 1產(chǎn)生的指針(不存在)陣列[5]的int自帶后a,并ptr指向(不存在)int附帶之后a。從中減去1 ptr產(chǎn)生一個指向最后一個元素的指針a。
注意:一般來說,不能使用非空指針的值不指向有效的對象。但是,指向數(shù)組末尾的指針是一個例外。這使ptr合法的初始化,即使它不能被解除引用。
4.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:9
在中foo,b有指向數(shù)組[3]的類型指針int,并在增量后指向數(shù)組a[1]()。所以b[1]有類型數(shù)組[3] int,它表示數(shù)組a[2]()。在值上下文中,b[1]“decay”成一個指向a[2][0](7)的指針,所以b[1][1]表示a[2][1],其值從8變?yōu)?。
好了看了上面4題也辛苦閱讀的你了,接下來做個基礎(chǔ)不過的程序了。
5.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:c=3 d=5
逗號運(yùn)算符評估兩個操作數(shù)并生成第二個值。它的優(yōu)先級也低于賦值。因此c = a, b相當(dāng)于c = a,而d = (a, b)相當(dāng)于d = b。
好了看這么多了,我們不妨研究點(diǎn)有意思的新東西,在C++11 標(biāo)準(zhǔn)中有可變長參數(shù)的函數(shù),接下來就看一看這樣的使用。
如果你能耐心看題到這里,說明你是一位非常專注與C/C++的學(xué)習(xí)者或者成功者,有興趣不妨關(guān)注文末的粉絲群。
6.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:5
該va_arg宏產(chǎn)生的“傳遞參數(shù)...”一個可變參數(shù)函數(shù)的一部分。在ripple它將被調(diào)用兩次,i首先設(shè)置為5,然后到7。
表達(dá)式i &= i - 1重置最右邊的1位i。例如,如果i是6(二進(jìn)制110),i & i - 1則是4(二進(jìn)制100)。內(nèi)部for循環(huán)執(zhí)行到i0,所以k增加了1位的數(shù)量i。
5(二進(jìn)制101)和二進(jìn)制111(二進(jìn)制)中有兩個1位,所以ripple返回5。
7.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:cd
在f,p最初指向指針數(shù)組中的第一個char*("ab")argv。添加sizeof(int)= 2 p使其指向第三個char*("ef"),之后p[-1]表示第二個char*("cd")。
8.如圖所示temp是什么類型?

這題其實(shí)很簡單,不過一般大學(xué)生很少看到
漲姿勢:
結(jié)果:指向函數(shù)的指針取兩個指針float參數(shù)并返回int
該typedef聲明為一個類型創(chuàng)建一個同義詞,然后可以用它來聲明該類型的對象。注意這個類型的新名字出現(xiàn)在一個變量名的位置上,好像你正在聲明一個變量(你不知道)。與#define指令的語法相比,這可以使其看起來倒退。
9.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:0 1 2 0
在偽代碼中(接觸下偽代碼吧)
e(0), e(-1) -> {}
e(1) -> -> {{}, print 0, {}} ->
e(2) -> -> {, print 1, {}} ->
e(3) -> -> {, print 2, } ->
10.如圖所示程序的輸出是什么?

漲姿勢:
結(jié)果:2 3 5 6
在這里,a有數(shù)組[3]的類型數(shù)組[2] int,ptr最初指向第一個數(shù)組[3]()。增量后,它指向第二個數(shù)組[3]()。當(dāng)然,*ptr表示ptr正好指向的數(shù)組[3] 。
希望對大家有幫助!
對于很多初學(xué)者來說,有一群一起學(xué)習(xí)一起解答的小伙伴很重要!如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!
微信公眾號:C語言編程學(xué)習(xí)基地
整理分享(多年學(xué)習(xí)的源碼、項目實(shí)戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
編程學(xué)習(xí)書籍分享:

粉絲編程交流:
