嵌軟八股大全3 - C 關(guān)鍵字
1、變量
1.1、類(lèi)型
auto | 自動(dòng) | --- | - | - |
char | 字符型 | [-128, 127] |
1 | 1 |
void | 空 | --- | 0 | 0 |
short | 短整型 | [-32768, 32767] |
2 | 2 |
int | 整形型 | [-2^31, 2^31] |
4 | 4 |
long | 長(zhǎng)整型 | [-2^31, 2^31] |
4 | 8 |
float | 浮點(diǎn)型 | [-2^31, 2^31] |
4 | 4 |
double | 雙浮點(diǎn) | [-2^63, 2^63] |
8 | 8 |
注意以下幾點(diǎn)
- C 中,
auto
關(guān)鍵字幾乎是沒(méi)有使用的,因?yàn)樗性趬K作用域內(nèi)聲明的變量默認(rèn)都是自動(dòng)變量 - C++ 中,
auto
關(guān)鍵字用于讓編譯器根據(jù)變量初始化的值自動(dòng)推導(dǎo)變量的類(lèi)型
1.2、作用域
局部變量 -> 作用域從聲明開(kāi)始,到包含它的函數(shù)或代碼塊結(jié)束為止
全局變量 -> 作用域從聲明開(kāi)始,到程序結(jié)束
2、修飾
2.1、const 常量
聲明常量,只讀,不可修改,注意以下幾點(diǎn)
- 定義時(shí)必須初始化
2.2、register 寄存器
建議編譯器將變量存儲(chǔ)在 CPU 寄存器中,而不是常規(guī)的內(nèi)存中
需要注意以下幾點(diǎn)
- 只能用于局部變量和函數(shù)參數(shù),不能用于全局變量或靜態(tài)變量
- 不能對(duì)該變量進(jìn)行取地址操作,因?yàn)榧拇嫫鳑](méi)有內(nèi)存地址
2.3、restrict 限制
用于修飾指針,表明這個(gè)指針是唯一指向它們所指向內(nèi)存區(qū)域的方式
2.4、signed 有符號(hào)
變量定義時(shí),不指定 unsigned 則默認(rèn)為 signed,最高位表示符號(hào)位
2.5、static 靜態(tài)
#include "stdio.h"
//靜態(tài)全局變量
static int global;
//靜態(tài)函數(shù)
static int function(void)
{
// ?
printf("%d", global);
// ?
printf("%d", local);
return 0;
}
int main(void)
{
//靜態(tài)局部變量
static int local;
function();
}
靜態(tài)局部變量 -> 生命周期擴(kuò)展到整個(gè)程序運(yùn)行期間,但其作用域仍然局限于函數(shù)內(nèi)部
靜態(tài)全局變量、靜態(tài)函數(shù) -> 作用域被限制在聲明它的文件中
總結(jié)作用如下:
聲明靜態(tài)變量/函數(shù),作用在不同的對(duì)象上有不同的效果,如下所示
- 全局變量、函數(shù)
- 作用域會(huì)限制在該文件中,不能被其他文件訪問(wèn),可以防止命名沖突
- 局部變量
- 生命周期延續(xù)到程序結(jié)束,而不僅僅是函數(shù)執(zhí)行期間
- 類(lèi)中變量
- 在類(lèi)的所有實(shí)例間共享,只存在一份
- 類(lèi)中成員函數(shù)
- 可以在沒(méi)有對(duì)象實(shí)例的情況下調(diào)用,只能訪問(wèn)靜態(tài)成員變量和其他靜態(tài)成員函數(shù)
2.6、unsigned 無(wú)符號(hào)
指定變量為無(wú)符號(hào)類(lèi)型
2.7、volatile 易變
2.7.1、定義
告訴編譯器該變量可能會(huì)在程序的任何時(shí)候被其他進(jìn)程或硬件修改,必須在每次訪問(wèn)時(shí)從內(nèi)存讀取
2.7.2、應(yīng)用場(chǎng)合
- 硬件寄存器 -> 程序需要直接訪問(wèn)硬件設(shè)備的寄存器時(shí)
- 中斷服務(wù)程序(ISR)中的變量 -> 當(dāng)變量在主程序和 ISR 中都可能被訪問(wèn)和修改時(shí)
- 多線程環(huán)境中的共享變量 -> 變量在多個(gè)線程之間共享并且可能被一個(gè)線程修改
2.7.3、作用
- 防止編譯器優(yōu)化
- 確保內(nèi)存操作的可見(jiàn)性
3、循環(huán)、判斷、選擇語(yǔ)句
3.1、if else
#include <stdio.h>
int main()
{
int a,b;
printf("input a and b:\n");
scanf("%d %d",&a,&b);
if(a >= b){
printf("a >= b\n");
}
else{
printf("a < b\n");
}
}
3.2、switch case default
#include <stdio.h>
int main()
{
int num;
printf("input a int number:\n");
scanf("%d",&num);
switch (num) {
case 1:
printf("Number is 1\n");
break;
case 2:
printf("Number is 2\n");
break;
case 3:
printf("Number is 3\n");
break;
default:
printf("Number is not 1, 2, or 3\n");
}
return 0;
}
注意以下幾點(diǎn)
- switch 后面的表達(dá)式必須是可隱式轉(zhuǎn)換為整數(shù)類(lèi)型的值(整數(shù)、枚舉和字符類(lèi)型),不能是浮點(diǎn)數(shù)或者其他類(lèi)型
3.3、for
#include <stdio.h>
int main()
{
for(int i=0;i<5;i++){
printf("%d,", i);
}
return 0;
}
output:
0,1,2,3,4,
3.4、do while
#include <stdio.h>
int main()
{
int a = 0;
do{
a++;
printf("%d,", a);
}while(a<5);
return 0;
}
output:
1,2,3,4,5,
注意與 “3.3、for” 的區(qū)別,先 do 再判斷 while 條件
3.5、問(wèn)題
問(wèn)題一:以下循環(huán)執(zhí)行次數(shù)是1次的是 (BC)
- A.
for(int i=10,j=1;i=j=0;i++,j--){ }
- B.
do{ }while(0)
- C.
int i=1; while(i--){ }
- D.
unsigned char i; for(i=255;i<256;i++){ }
解答:
- 循環(huán)次數(shù) 0 次,for 語(yǔ)句的判斷條件為
i=j=0
,該表達(dá)式結(jié)果為 0 ,條件不滿足不執(zhí)行循環(huán)體 - 循環(huán)次數(shù) 1 次,先 do 再 while,whil
剩余60%內(nèi)容,訂閱專(zhuān)欄后可繼續(xù)查看/也可單篇購(gòu)買(mǎi)
歡迎來(lái)到我的專(zhuān)欄,在這里,我將整理并分享2024年各大企業(yè)的真實(shí)筆試/面試真題,同時(shí)還整理了嵌入式軟件相關(guān)的八股知識(shí)。專(zhuān)欄內(nèi)容涵蓋C/C++基礎(chǔ)、嵌軟常見(jiàn)通信協(xié)議、ARM、FreeRTOS、Linux OS相關(guān)問(wèn)題匯總,希望能幫助求職者了解考試趨勢(shì)和嵌入式常見(jiàn)考點(diǎn)。無(wú)論你是準(zhǔn)備面試,還是希望提升自己的專(zhuān)業(yè)知識(shí),這里都能為你提供寶貴的參考和學(xué)習(xí)資源。