嵌入式筆試刷題(第36天)
11. const 有什么用途?(請(qǐng)至少說(shuō)明兩種)
? 答案:
- 修飾變量:變量只讀,防止修改。
- 修飾函數(shù)參數(shù):保護(hù)傳入?yún)?shù),防止在函數(shù)內(nèi)意外更改。
- 修飾返回值:保證返回值不被修改。
- 修飾成員函數(shù):表示成員函數(shù)不會(huì)修改對(duì)象內(nèi)容。
? 講解:
常見(jiàn)用法示例:
const int a = 10; // 變量只讀 void func(const int* p); // 指針指向的數(shù)據(jù)不能改 class A { public: int getValue() const; // 成員函數(shù)不會(huì)修改成員變量 };
12. 在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加 extern "C" 聲明?
? 答案:
- 因?yàn)?C++ 支持函數(shù)名重載,C語(yǔ)言不支持。
extern "C"
禁止C++編譯器對(duì)函數(shù)名進(jìn)行改名(Name Mangling)。- 保證C++程序能正確鏈接C編譯的函數(shù)。
? 講解:
C++編譯器會(huì)把函數(shù)名帶上參數(shù)信息做"花名"處理,比如 int foo(int)
編譯成 _Z3fooi
。
加了 extern "C"
,編譯器就按C的規(guī)則保留原名:
extern "C" void foo();
這樣C++能直接找到C語(yǔ)言的符號(hào),完成鏈接。
13. 給定int a,寫(xiě)兩行代碼,設(shè)置第三位和清除第三位,保持其他位不變。
? 答案:
a |= (1 << 3); // 設(shè)置第3位為1 a &= ~(1 << 3); // 清除第3位為0
? 講解:
(1 << 3)
:把1左移3位,得到掩碼0x08
。|=
:位或,設(shè)置某位為1。&= ~
:位與取反,清除某位為0。
第三位指的是從0開(kāi)始數(shù)的第3位(也就是數(shù)值8
的位置)。
14. 不調(diào)用庫(kù)函數(shù)的情況下實(shí)現(xiàn)一個(gè) strcpy 函數(shù)。
? 答案:
char* my_strcpy(char* dest, const char* src) { char* ret = dest; while ((*dest++ = *src++)); // 包括拷貝\0 return ret; }
? 講解:
跟之前第4題一樣,這里再?gòu)?qiáng)調(diào):
while ((*dest++ = *src++));
把賦值和判斷合成一行,非常高效。- 拷貝結(jié)束標(biāo)志是拷貝了字符串結(jié)束符
\0
。
15. What will be printed as the result of the operation below, why?
void foo(void) { unsigned int a = 6; int b = -20; (a+b > 6) ? puts("> 6") : puts("< 6"); }
? 答案:
> 6
? 講解:
a=6
是unsigned int
,b=-20
是int
。a+b
中,b
被隱式轉(zhuǎn)換成unsigned,因?yàn)?code>unsigned + sign,規(guī)則是提升到。
剩余60%內(nèi)容,訂閱專(zhuān)欄后可繼續(xù)查看/也可單篇購(gòu)買(mǎi)
嵌入式筆試專(zhuān)欄 文章被收錄于專(zhuān)欄
本專(zhuān)欄系統(tǒng)整理了嵌入式方向筆試中常見(jiàn)的知識(shí)點(diǎn)和高頻考題,涵蓋基礎(chǔ)理論、常用算法、C語(yǔ)言陷阱、操作系統(tǒng)原理、驅(qū)動(dòng)開(kāi)發(fā)、常見(jiàn)外設(shè)通信協(xié)議(如 I2C/SPI/UART)、RTOS、Linux 內(nèi)核、以及實(shí)用電路知識(shí)等內(nèi)容。