前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言】关键字

【C语言】关键字

作者头像
平凡的人1
发布2022-11-15 14:46:59
7170
发布2022-11-15 14:46:59
举报
文章被收录于专栏:从小白开始修炼

✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改


文章目录

🍁了解关键字分类

C语言一共多少个关键字呢? 一般的书上,都是32个(包括本书),但是这个都是 C90(C89) 的标准。其实 C99 后又新增了5个关键字。 不过,目前主流的编译器,对 C99 支持的并不好,我们后面默认情况,使用 C90即认为32个

关键字及其说明

  1. auto 声明自动变量
  2. short 声明短整型变量或函数
  3. int 声明整型变量或函数
  4. long 声明长整型变量或函数
  5. float 声明浮点型变量或函数
  6. double 声明双精度变量或函数
  7. char 声明字符型变量或函数
  8. struct 声明结构体变量或函数
  9. union 声明共用数据类型
  10. enum 声明枚举类型
  11. typedef 用以给数据类型取别名
  12. const 声明只读变量
  13. unsigned 声明无符号类型变量或函数
  14. signed 声明有符号类型变量或函数
  15. extern 声明变量是在其他文件正声明
  16. register 声明寄存器变量
  17. static 声明静态变量
  18. volatile 说明变量在程序执行中可被隐含地改变
  19. void 声明函数无返回值或无参数,声明无类型指针
  20. if 条件语句
  21. else 条件语句否定分支(与 if 连用)
  22. switch 用于开关语句
  23. case 开关语句分支
  24. for 一种循环语句
  25. do 循环语句的循环体
  26. while 循环语句的循环条件
  27. goto 无条件跳转语句
  28. continue 结束当前循环,开始下一轮循环
  29. break 跳出当前循环
  30. default 开关语句中的“其他”分支
  31. sizeof 计算数据类型长度
  32. return 子程序返回语句(可以带参数,也可不带参数)循环条件

🍁理解变量、定义与声明

问题一:什么是变量

在内存中开辟特定大小的空间,用来保存数据 关键字:内存

问题二:如何定义变量(怎么用)❓

int a = 10; char b = ‘a’; double c = 3.14; 类型 变量名 = 默认值

问题三:为什么要定义变量(为什么)❓

计算机是为了解决人计算能力不足的问题而诞生的。即,计算机是为了进行计算的。 而计算,就需要数据。 而要计算,任何一个时刻,不是所有的数据都要立马被计算。 如同:要吃饭,不是所有的饭菜都要立马被你吃掉。饭要一口一口吃,那么你还没有吃到的饭菜,就需要暂时放在盘子里。 这里的盘子,就如同变量,饭菜如同变量里面的数据。 换句话说,为何需要变量?因为有数据需要暂时被保存起来,等待后续处理。 那么,为什么吃饭要盘子?我想吃一口菜了,直接去锅里找不行吗?当然行,但是效率低。 因为我们吃饭的地方,和做饭的地方,是比较"远"的

变量定义的本质

我们现在已知:

  1. 程序运行,需要加载到内存中
  2. 程序计算,需要使用变量

那么,定义变量的本质: 在内存中开辟一块空间,用来保存数据。(为何一定是内存:因为定义变量,也是程序逻辑的一部 分,程序已经加载到内存)


🍁三个关键字

最宽宏大量的关键字- auto

由于介绍auto涉及到变量,所以我们想从变量这个地方开始说起

变量的分类——补充内容
代码语言:javascript
复制
//局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动 释放。[网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的] 
//全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。 
//代码块:用{}括起来的区域,就叫做代码块  
#include <stdio.h> 
#include <windows.h> 
int g_x = 100; //全局变量 
int main() 
{ 
    int x = 10; //局部变量,main函数也是函数,也有代码块{} 
    printf("x:%d\n", x); 
    system("pause"); 
    return 0; 
}
变量的作用域—— 补充内容
代码语言:javascript
复制
//作用域概念:指的是该变量的可以被正常访问的代码区域  
#include <stdio.h> 
#include <windows.h> 
int main() 
{ 
    int x = 10; 
    if (x == 10)
    { 
        int y = 20; 
        printf("局部: x: %d, y: %d\n", x, y);//y只能在本代码块内有效 
    }
    printf("局部: x: %d, y: %d\n", x, y); //报错,y不能被访问 
    system("pause");
    return 0;
}
//局部变量:只在本代码块内有效 //例子同上 
//全局变量:整个程序运行期间,都有效
#include <stdio.h> 
#include <windows.h> 
int g_x = 100; //全局变量 
void show() 
{ 
    printf("show: 全局: %d\n", g_x); //在任何代码块中都可以被访问 
}
int main() 
{
     show(); 
     printf("main: 全局: %d\n", g_x); //在任何代码块中都可以被访问,甚至被修改 
     system("pause"); 
     return 0; 
} 

#include <stdio.h> 
#include <windows.h>
int g_x = 100; //全局变量 
int main() 
{ 
    int g_x = 10; //局部变量,与全局同名
    printf("g_x:%d\n", g_x); //输出的是局部,也就是局部和全部同名的时候,优先局部。所以,强烈不建议这样
    system("pause"); 
    return 0; 
}
变量的生命周期——补充内容

生命周期概念:指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间被释放 局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量 全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效

auto 相关
代码语言:javascript
复制
//如何使用:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略 
//默认的所有变量都是auto吗?不是,一般用来修饰局部变量 
//中断一下:后面我们所到的,局部变量,自动变量,临时变量,都是一回事。我们统称局部变量
#include <stdio.h> 
#include <windows.h> 
int main() 
{
    for (int i = 0; i < 10; i++)
    {
        printf("i=%d\n", i); 
        if(1) 
        { 
         auto int j = 0; //自动变量
         printf("before: j=%d\n", j); 
         j += 1; 
         printf("after : j=%d\n", j); 
        }
    }
    system("pause"); 
    return 0; 
}

最快的关键字—— register

其实,CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那么也就需要CPU具有一定的数据临时存储能力。注意:CPU并不是当前要计算了,才把特定数据读到CPU里面,那样太慢了,所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。

怎么去理解呢?我们可以通过一幅图来理解:

image-20220621215621089
image-20220621215621089

距离CPU越近的存储硬件,速度越快。

寄存器存在的本质 :在硬件层面上,提高计算机的运算效率。因为不需要从内存里读取数据

register 修饰变量尽量将所修饰变量,放入CPU寄存区中,从而达到提高效率的目的

问题来了:

那么什么样的变量,可以采用register呢?

  1. 局部的(全局会导致CPU寄存器被长时间占用)
  2. 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
  3. 高频被读取的(提高效率所在)
  4. 如果要使用,请不要大量使用,因为寄存器数量有限
  5. 这里除了上面的,再有一点,就是register修饰的变量,不能取地址(因为已经放在寄存区中了嘛,地址是内存相关的概念)
代码语言:javascript
复制
#include <stdio.h> 
#include <windows.h> 
int main() 
{ 
    register int a = 0; 
    printf("&a = %p\n", &a); //编译器报错:错误 1 error C2103: 寄存器变量上的“&” 
    //注意,这里不是所有的编译器都报错
    //鉴于同学们刚开始学,不给大家增加负担,我们后面再慢慢引入另一个编译器。 
    system("pause"); 
    return 0; 
}

我们不妨来测试一下:

image-20220621220239930
image-20220621220239930

不过现在我们是不需要自己手动去加该关键字的了,原因:该关键字,不用管,因为现在的编译器,已经很智能了,能进行比人更好的代码优化。 早期编译器需要人为指定register,来进行手动优化,现在不需要了。

最名不符实的关键字 —static

全局变量和函数的两个结论 - 补充内容

  1. 全局变量,是可以跨文件,被访问的。
  2. 全局函数,是可以跨文件,被访问的。
修饰变量

1.修饰全局变量,该全局变量只能在本文件内被使用。

总结:static修饰全局变量,影响的是作用域的概念,函数类似。而生命周期是不变的。

2.修饰局部变量

代码语言:javascript
复制
 void fun1() 
 { 
     int i = 0; 
     i++; 
     printf("no static: i=%d\n", i); 
 }
void fun2()
{ 
    static int i = 0; 
    i++; 
    printf("has static: i=%d\n", i);
}
int main() 
{ 
    for (int i = 0; i < 10; i++)
    { 
        fun1(); fun2(); }
    system("pause"); 
    return 0;
}
//结论:static修饰局部变量,变量的生命周期变成全局周期。(作用域不变)
//修饰函数,该函数只能在本文件内被使用。

🚩结语

说来惭愧,今天又是摆烂的一天,不知不觉又快到了十二点,这一天天过的可真的快啊,本次就先到这里结束啦!🌹

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 🍁了解关键字分类
    • 关键字及其说明
    • 🍁理解变量、定义与声明
    • 🍁三个关键字
      • 最宽宏大量的关键字- auto
        • 最快的关键字—— register
          • 最名不符实的关键字 —static
          • 🚩结语
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档