考題 軟體工程師 嵌入式

2023-01-26 16:48:06 字數 4467 閱讀 3593

1. 算術運算子,賦值運算子和關係運算子的運算優先順序按從高到低依次為

a. 算術運算、賦值運算、關係運算

b. 算術運算、關係運算、賦值運算

c. 關係運算、賦值運算、算術運算

d. 關係運算、算術運算、賦值運算

答案:b

2. c語言中,下列運算子優先順序最高的是

a. !

b. %

c. >>

d. ==

答案:a

3. 陣列定義為「 int a [ 4 ] ; 」,錯誤的表示式是 ( )

a. *a

b. a [ 0 ]

c. a

d. a++

答案:d

4. 執行語句「 k=7>>1; 」後,變數 k 的當前值是

a.15

b.31

c.3d.1

答案:c

5. 乙個32位的機器,該機器的指標是多少位

答案: 32位

6. 關鍵字static的作用是什麼?

答案:在c語言中,關鍵字static有三個明顯的作用:

1). 在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。

2). 在模組內(但在函式體外),乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。

3). 在模組內,乙個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。

7. const有什麼主要的作用?

答案:const有什麼主要的作用?

◆ 可以定義const常量,具有不可變性。 例如:

const int max=100; int array[max];

◆ (2)便於進行型別檢查,使編譯器對處理內容有更多了解,消除了一些隱患

例如: void f(const int i編譯器就會知道i是乙個常量,不允許修改;

◆ (3)可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。

同巨集定義一樣,可以做到不變則已,一變都變!如(1)中,如果想修改max的內容,只需要:const int max=you want;即可!

◆ (4)可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。

還是上面的例子,如果在函式體內修改了i,編譯器就會報錯;

例如:void f(const int i)

◆ (5) 為函式過載提供了乙個參考。

class a

;◆ (6) 可以節省空間,避免不必要的記憶體分配。

例如:#define pi 3.14159 //常量巨集

const doulbe pi=3.14159; //此時並未將pi放入rom中 ......

double i=pi; //此時為pi分配記憶體,以後不再分配!

double i=pi; //編譯期間進行巨集替換,分配記憶體

double j=pi; //沒有記憶體分配

double j=pi; //再進行巨集替換,又一次分配記憶體!

const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有若干個拷貝。

◆ (7) 提高了效率。

編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

8. 關鍵字volatile有什麼含意?並給出三個不同的例子。

答案:乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。

例子1:並行裝置的硬體暫存器(如:狀態暫存器)

例子2:乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)

例子3:多執行緒應用中被幾個任務共享的變數

9. 陣列和鍊錶的區別

答案:陣列:資料順序儲存,固定大小

鍊錶:資料可以隨機儲存,大小可動態改變

10. 下面這段**的列印結果是什麼?

main()

; int *ptr=(int *)(&a+1);

printf("%d , %d",*(a+1),*(ptr-1));

} 答案:2 , 5

11. 下面的**片段的輸出是什麼

char *ptr;

if ((ptr = (char *)malloc(0)) == null)

puts("got a null pointer");

else

puts("got a valid pointer");

答案:**的輸出是"got a valid pointer"

12. 寫乙個"標準"巨集min ,這個巨集輸入兩個引數並返回較小的乙個。

答案:#define min(a,b) (((a)<= (b)) ? (a) : (b))

注意:不能缺少括號

13. 請問以下**有什麼問題:

int main()

答案:沒有為str分配記憶體空間,將會發生異常問題出在將乙個字串複製進乙個字元變數指標所指位址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程式崩潰。

14. 給定乙個整型變數a,寫兩段**,第乙個設定a的bit 3為1,第二個設定a 的bit 3為0。在以上兩個操作中,要保持其它位不變。

參***:

#define bit3 (0x1 << 3)

static int a;

void set_bit3(void)

void clear_bit3(void)

15. 交換兩個整型變數的值,不使用第三個變數。即a=3,b=5,交換之後a=5,b=3;

答案:有兩種解法,一種用算術演算法, 一種用^(異或)演算法

算術演算法:

a = a + b;

b = a - b;

a = a - b;

異或演算法:

a = a^b;

b = a^b;

a = a^b;

16. 下面的**輸出是什麼,為什麼?

void foo(void)

答案:輸出是 ">6"。

原因是當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此-20變成了乙個非常大的正整數,所以該表示式計算出的結果大於6。

17. 已知乙個陣列table,用乙個巨集定義,求出資料的元素個數。

答案:#define ntbl(table) (sizeof(table) / sizeof(table[0]))

18. 請寫乙個c函式,若處理器是big_endian返回0;若是little_endian的,則返回1

答案:int checkcpu( )

c;= 1;

return( ==1);

} 嵌入式系統開發者應該對little-endian和big-endian模式非常了解。採用little-endian模式的cpu對運算元的存放方式是從低位元組到高位元組,而big-endian模式對運算元的存放方式是從高位元組到低位元組。例如,16bit寬的數0x1234在little-endian模式cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

而在big-endian模式cpu記憶體中的存放方式則為:

32bit寬的數0x12345678在little-endian模式cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

而在big-endian模式cpu記憶體中的存放方式則為:

聯合體union的存放順序是所有成員都從低位址開始存放,可以利用該特性,輕鬆地獲得了cpu對記憶體採用little-endian還是big-endian模式讀寫。

19. 編寫乙個函式,作用是把乙個char組成的字串迴圈右移n個。

比如原來是「abcdefghi」如果n=2,移位後應該是「hiabcdefgh」

函式頭是這樣的:

//pstr是指向以'\0'結尾的字串的指標

//steps是要求移動的n

void loopmove ( char * pstr, int steps )

答案:void loopmove ( char *pstr, int steps )

20. 在c++程式中呼叫被 c編譯器編譯後的函式,為什麼要加 extern 「c」?

答案:c++語言支援函式過載,c語言不支援函式過載。

函式被c++編譯後在庫中的名字與c語言的不同。假設某個函式的原型為: void foo(int x, int y);該函式被c編譯器編譯後在庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。

c++提供了c連線交換指定符號extern「c」來解決名字匹配問題。

21. 在請問執行test函式會有什麼樣的結果

void getmemory(char *p)

{p = (char *)malloc(100);

嵌入式軟體工程師簡歷

程軒性別 男年齡 24歲 籍貫 江西上饒市政治面貌 團員 聯絡 18676974 2823640 8 電子郵箱 chengxuan10 位址 江西省上饒市 求職意向 職位 嵌入式工程師 工作地點 深圳 教育經歷 2010 09 至今 江西財經大學軟體工程本科 綜合技能 英語讀寫能力不錯,獲得cet ...

嵌入式軟體工程師如何學習

嵌入式行業,技術的更新是非躊的,每一位工程師都需要在中不斷的更新自己的知識,掌握技術動態或者解決自己中遇到的問題,以下是嵌入式軟體工程師獲取新知識的一些方式,也給即將成為嵌入式工程師的你一些好的建議 調查資料顯示,在嵌入式工程師經常關顧的 中,csdn和21ic所佔的比例最大,分別為23 和18 而...

嵌入式軟體開發工程師的簡歷

簡歷是用於應聘的書面交流材料,它向未來的雇主表明自己擁有能夠滿足特定工作要求的技能 態度 資質和自信。成功的簡歷就是一件營銷 它向未來的雇主證明自己能夠解決他的問題或者滿足他的特定需要,因此確保能夠得到會使自己成功的面試。下面是給大家整理的嵌入式工程師簡歷模板內容,希望能給你帶來幫助 姓名 性別 男...