深剖关键字(跑路人笔记1)

简介: 深剖关键字(跑路人笔记)

前言

本章是对C语言(C89)32个关键字中的部分关键字进行深度剖析以关键字为模块一个一个剖析,当然内容自然不会局限在关键字里

开搞!

程序的运行

#include <stdio.h>
int main() 
{ 
    printf("hello world!\n"); 
    return 0; 
}//回到了起点哈哈哈哈

我们在执行该程序的时候通过预处理章节的知识可以知道我们的编译器通过编译连接等操作将我们的计算机语言转换成可执行程序语言(二进制语言), 然后我们的编译器会将它以文件的形式保存在硬盘中(可以找找在debug文件夹里后缀为.exe的文件就是可执行程序文件)当我们双击可执行文件时, 我们的电脑就将文件中的计算机语言加载到内存中让计算机运行.(当然大部分编译器可以直接运行程序)


也就是说我们程序在运行前需要先加载到内存中才可以被执行


定义和声明

变量是什么


在内存中的某个空间开辟内存用于数据的储存。


定义变量的原因


变量的作用相当于吃饭时的碗,他将我们马上要使用的数据进行储存,方便计算机的读取,从而加速了计算机的运行速度


变量的本质


我们定义变量的本质其实也就是在内存中开辟一个固定的内存来盛放我们的数据


变量的声明


声明不开辟空间只告知.extern 时将内容补齐


auto关键字(很少使用了)

auto是一个很老的关键字了=-=


我们定义在代码块里的变量(及局部变量)默认都是被auto修饰的(都省略了)所以不写倒也没关系


补充知识(可跳过)

讲一下作用域生命周期和代码块的相关知识


代码块:


用{}括起来的区域,就叫做代码块,


局部变量:


在代码块里被声明的变量叫做局部变量, 如果不被static修饰的话局部变量的作用域和生命周期都是在代码块内随着代码块的结束而释放.


全局变量:


在所有函数外(不被任何代码块包含)声明叫做全局变量,全局变量只有程序运行结束才会被释放.


register

注:现在编译器已经十分智能这个关键字也已经很少被使用了.


功能: 将修饰的变量推荐给寄存器,从而使编程速度加快


从推荐二字可以看出register的能力并不强,而且现在的编译器也十分智能了,知道将运算多的变量推荐给寄存器了


补充知识

我们的cpu作为计算的主要硬件,为了方便运算会先将数据从内存读取到CPU中,所以我们的CPU也就要有一些暂时储存的能力.


所以我们的CPU就集成了寄存器来暂时保存数据.


所以寄存器存在的本质是为了加快运行速度因为不需要从内存中读取数值了.


static

首先我们需要先知道,全局变量和函数是可以跨文件使用的(记得声明及extern)


关键字功能


修饰局部变量加长局部变量的生命周期

修饰全局变量使他只能在本文件中使用

修饰函数使他只能在本文件中使用

修饰内容都放在静态区进行保存.


bool类型

C语言有没有bool类型?


c99之前,主要是c90是没有的,目前大部分书,都是认为没有的。因为书,一般都要落后于行业。


但是c99引入了 _Bool类型(你没有看错,_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了 bool,为了保证C/C++兼容性)。


#include <stdio.h>
#include <stdbool.h>//没有这个头文件会报错,使用新特性一定要加上
#include <windows.h>
int main() 
{ 
    bool ret = false;
    ret = true; 
    printf("%d\n", sizeof(ret));//vs2013 & 2019 和 Linux中都是1
    system("pause"); 
    return 0; 
}



下面有个特殊案例


int main() 
{//在vs中,光标选中BOOL,单击右键,可以看到转到定义,就能看到BOOL是什么 
    BOOL ret = FALSE; 
    ret = TRUE; 
    printf("%d\n", sizeof(ret)); 
    //输出结果是4,因为在源代码中,是这么定义的:typedef int BOOL; 
    system("pause");
    return 0;
}



这个特例是是Microsoft也就是微软自己编辑的一个bool类型是只针对微软而创建了所以在使用时只有在微软系统里才可以正常运行.


如在Linux中就会直接报错,而我们在编译代码时为了代码的可移植行不建议使用上面的特殊案例写法


在使用bool类型时

#include<stdbool.h>
int main() 
{
  int pass = 0;//0表示假,C90,我们习惯用int表示bool 
  //bool pass = false; C99
  if (pass == 0)
  {
    //理论上可行,但此时的pass是应该被当做bool看待的,==用来进行整数比较,不推荐
    //TODO 
  }
  if (pass == false)
  { //不推荐,尽管在C99中也可行
    //TODO
  }
    if (pass)
  { //推荐
  //TODO 
  }
  //理论上可行,但此时的pass是应该被当做bool看待的,==用来进行整数比较,不推荐 
  //另外,非0为真,但是非0有多个,这里也不一定是完全正确的 
  if (pass != 1)
  {
    //TODO 
  }
  if (pass != true)
  { //不推荐,尽管在C99中也可行 
      //TODO 
  }
  if (!pass)
  { //推荐 
    //TODO 
  }
  system("pause");
  return 0; 
}

我们如果使用bool类型不建议使用==号直接进行判断就好当然使用了也无所谓

相关文章
|
NoSQL Linux Redis
Redis内存分析工具RDR
感觉开发越是做到后面,除了对程序本身的理解;更多的是对工具的了解和运用,了解不同的工具的作用,对开发效率以及问题的快速定位,都有一个质的飞越。 背景是这样子的,我们有个业务需要对大量数据进行实时分析,底层服务一直不太稳定,内存以及cpu占用都非高,大量占用系统资源;由于数据量大,之前负责的同事也一直没有找到好的方法,单纯的依靠人力去分析代码,搞了挺长时间也没有根本性的解决问题,总是治标不治本。
1104 0
Redis内存分析工具RDR
|
弹性计算 数据可视化 关系型数据库
【最佳实践】Filebeat实现MySQL日志轻量化发送至Elasticsearch
在今天的文章中,我们来详细地描述如果使用Filebeat把MySQL的日志信息传输到Elasticsearch中。
4659 0
【最佳实践】Filebeat实现MySQL日志轻量化发送至Elasticsearch
|
Android开发
【错误记录】Android 可执行权限报错 ( Cannot run program “/data/user/0/cn.e/ffmpeg“: error=13,Permission denied )
【错误记录】Android 可执行权限报错 ( Cannot run program “/data/user/0/cn.e/ffmpeg“: error=13,Permission denied )
2222 0
【错误记录】Android 可执行权限报错 ( Cannot run program “/data/user/0/cn.e/ffmpeg“: error=13,Permission denied )
|
负载均衡 Cloud Native 持续交付
云原生时代的微服务架构:优势、挑战与实践
云原生时代的微服务架构:优势、挑战与实践
254 20
|
存储 SQL JSON
介绍一下RDBMS和NoSQL数据库之间的区别
【10月更文挑战第21天】介绍一下RDBMS和NoSQL数据库之间的区别
458 2
|
分布式计算 DataWorks 监控
dataworksworks数据开发
dataworksworks数据开发
371 3
|
Unix Linux C语言
`ctypes`是Python的一个标准库,它提供了C兼容的数据类型,并允许在Python中调用共享库中的函数。
`ctypes`是Python的一个标准库,它提供了C兼容的数据类型,并允许在Python中调用共享库中的函数。
|
存储 弹性计算 固态存储
ecs基本概念
ecs基本概念
494 1
|
SQL 物联网 数据挖掘
StarRocks:从概念到应用的下一代分析型数据库
在大数据时代,企业对数据处理的需求日益增长,特别是在实时数据分析方面。StarRocks 是一种新兴的分布式关系型数据库,专为快速且高并发的实时分析设计。本文将从 StarRocks 的基本概念入手,逐步深入到其应用层面,探讨这一技术如何在现实世界中发挥作用。
685 1
|
Kubernetes Shell Perl
文档解读 | K8S中的Pod和容器配置(一)
如何给运行在Kubernetes(K8S) Pod中的容器定义环境变量、命令行和参数? 给运行在Kubernetes Pod中的容器定义环境变量 开始之前 必须有一个Kubernets集群,和一个能和集群沟通的kubectl命令行工具。
5936 0