嵌软八股大全3 - C 关键字

1、变量

1.1、类型

类型 含义 范围 32 位下所占字节 64 位下所占字节
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

注意以下几点

  1. C 中,auto关键字几乎是没有使用的,因为所有在块作用域内声明的变量默认都是自动变量
  2. C++ 中,auto关键字用于让编译器根据变量初始化的值自动推导变量的类型

1.2、作用域

局部变量 -> 作用域从声明开始,到包含它的函数或代码块结束为止

全局变量 -> 作用域从声明开始,到程序结束

2、修饰

2.1、const 常量

声明常量,只读,不可修改,注意以下几点

  1. 定义时必须初始化

2.2、register 寄存器

建议编译器将变量存储在 CPU 寄存器中,而不是常规的内存中

需要注意以下几点

  1. 只能用于局部变量和函数参数,不能用于全局变量或静态变量
  2. 不能对该变量进行取地址操作,因为寄存器没有内存地址

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();  
}

静态局部变量 -> 生命周期扩展到整个程序运行期间,但其作用域仍然局限于函数内部

静态全局变量、静态函数 -> 作用域被限制在声明它的文件中

总结作用如下:

声明静态变量/函数,作用在不同的对象上有不同的效果,如下所示

  1. 全局变量、函数
    1. 作用域会限制在该文件中,不能被其他文件访问,可以防止命名冲突
  2. 局部变量
    1. 生命周期延续到程序结束,而不仅仅是函数执行期间
  3. 类中变量
    1. 在类的所有实例间共享,只存在一份
  4. 类中成员函数
    1. 可以在没有对象实例的情况下调用,只能访问静态成员变量和其他静态成员函数

2.6、unsigned 无符号

指定变量为无符号类型

2.7、volatile 易变

2.7.1、定义

告诉编译器该变量可能会在程序的任何时候被其他进程或硬件修改,必须在每次访问时从内存读取

2.7.2、应用场合

  1. 硬件寄存器 -> 程序需要直接访问硬件设备的寄存器时
  2. 中断服务程序(ISR)中的变量 -> 当变量在主程序和 ISR 中都可能被访问和修改时
  3. 多线程环境中的共享变量 -> 变量在多个线程之间共享并且可能被一个线程修改

2.7.3、作用

  1. 防止编译器优化
  2. 确保内存操作的可见性

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;  
}

注意以下几点

  1. 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)

  1. A. for(int i=10,j=1;i=j=0;i++,j--){ }
  2. B. do{ }while(0)
  3. C. int i=1; while(i--){ }
  4. D. unsigned char i; for(i=255;i<256;i++){ }

解答:

  1. 循环次数 0 次,for 语句的判断条件为 i=j=0 ,该表达式结果为 0 ,条件不满足不执行循环体
  2. 循环次数 1 次,先 do 再 while,whil

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。

全部评论

相关推荐

评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务