嵌软八股大全3 - C 关键字
1、变量
1.1、类型
auto | 自动 | --- | - | - |
char | 字符型 | [-128, 127] |
1 | 1 |
void | 空 | --- | 0 | 0 |
short | 短整型 | [-32768, 32767] |
2 | 2 |
int | 整形型 | [-2^31, 2^31] |
4 | 4 |
long | 长整型 | [-2^31, 2^31] |
4 | 8 |
float | 浮点型 | [-2^31, 2^31] |
4 | 4 |
double | 双浮点 | [-2^63, 2^63] |
8 | 8 |
注意以下几点
- C 中,
auto
关键字几乎是没有使用的,因为所有在块作用域内声明的变量默认都是自动变量 - C++ 中,
auto
关键字用于让编译器根据变量初始化的值自动推导变量的类型
1.2、作用域
局部变量 -> 作用域从声明开始,到包含它的函数或代码块结束为止
全局变量 -> 作用域从声明开始,到程序结束
2、修饰
2.1、const 常量
声明常量,只读,不可修改,注意以下几点
- 定义时必须初始化
2.2、register 寄存器
建议编译器将变量存储在 CPU 寄存器中,而不是常规的内存中
需要注意以下几点
- 只能用于局部变量和函数参数,不能用于全局变量或静态变量
- 不能对该变量进行取地址操作,因为寄存器没有内存地址
2.3、restrict 限制
用于修饰指针,表明这个指针是唯一指向它们所指向内存区域的方式
2.4、signed 有符号
变量定义时,不指定 unsigned 则默认为 signed,最高位表示符号位
2.5、static 静态
#include "stdio.h"
//静态全局变量
static int global;
//静态函数
static int function(void)
{
// ✅
printf("%d", global);
// ❌
printf("%d", local);
return 0;
}
int main(void)
{
//静态局部变量
static int local;
function();
}
静态局部变量 -> 生命周期扩展到整个程序运行期间,但其作用域仍然局限于函数内部
静态全局变量、静态函数 -> 作用域被限制在声明它的文件中
总结作用如下:
声明静态变量/函数,作用在不同的对象上有不同的效果,如下所示
- 全局变量、函数
- 作用域会限制在该文件中,不能被其他文件访问,可以防止命名冲突
- 局部变量
- 生命周期延续到程序结束,而不仅仅是函数执行期间
- 类中变量
- 在类的所有实例间共享,只存在一份
- 类中成员函数
- 可以在没有对象实例的情况下调用,只能访问静态成员变量和其他静态成员函数
2.6、unsigned 无符号
指定变量为无符号类型
2.7、volatile 易变
2.7.1、定义
告诉编译器该变量可能会在程序的任何时候被其他进程或硬件修改,必须在每次访问时从内存读取
2.7.2、应用场合
- 硬件寄存器 -> 程序需要直接访问硬件设备的寄存器时
- 中断服务程序(ISR)中的变量 -> 当变量在主程序和 ISR 中都可能被访问和修改时
- 多线程环境中的共享变量 -> 变量在多个线程之间共享并且可能被一个线程修改
2.7.3、作用
- 防止编译器优化
- 确保内存操作的可见性
3、循环、判断、选择语句
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;
}
注意以下几点
- switch 后面的表达式必须是可隐式转换为整数类型的值(整数、枚举和字符类型),不能是浮点数或者其他类型
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” 的区别,先 do 再判断 while 条件
3.5、问题
问题一:以下循环执行次数是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++){ }
解答:
- 循环次数 0 次,for 语句的判断条件为
i=j=0
,该表达式结果为 0 ,条件不满足不执行循环体 - 循环次数 1 次,先 do 再 while,whil
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式软件名企笔/面试真题合集 文章被收录于专栏
欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。