C 语言基础之C语言的常见关键字

目录
  • ​1、auto
  • 2、register
  • 3、signed和unsigned
  • 4、typedef
  • 5、extern
  • 6、拓展

首先我们简单的和这些关键字见见面(被高亮的关键字是今天要介绍的)

这其中有大家熟知的数据类型:intcharfloatdouble

也有控制语句用到的:iffordo

还有一些就是今天主要介绍的关键字。

至于还有一些新增的关键字,以上表格未曾提到,大家如果想去了解,可自行查找。

个别术语介绍(可先跳过,后文如若遇到不懂,可回来了解)

自动变量:指的是局部作用域变量,具体来说即是在控制流进入变量作用域时系统自动为其分配存空间, 并在离开作用域时释放空间的一类变量

存储类:是C语言与C++语言的标准中,变量与函数的可访问性(即作用域范围)与生存期

寄存器:寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。

​ 计算机中的数据可以存储到:寄存器,高速缓存器,内存,硬盘,网盘

​ (以上存储从左到右按照,内存越来越大,造假越来越低,传输速度越来越慢排序)

​1、auto

auto:声明自动变量,一般都省略

​ 默认情况下,在代码块内声明的变量都是自动变量,但亦可用自动变量的关键字auto明确标识存储类

代码如下:

int a=0;
//上下两个变量其实相同,只不过上面省略了auto
auto int a=0;

2、register

register:声明寄存器变量

​ 这个关键字定义变量后,会请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻 址访问,以提高效率。(因为寄存器很小,如果定义了很多register变量,可能会超过CPU的寄存 器个数,超过容量,故变量不是一定会存入寄存器内)

3、signed和unsigned

signed:有符号的(一般定义常量默认为signed)-------可以存储正数和负数

unsigned:无符号的-----不能存储负数

signed int a=10; //一般默认为signed,故只要写成:int a=10;

unsigned float=-75.3------>错误定义

float=-75.3------>正确定义

signed float=-75.3------->正确定义

4、typedef

typedef:类型重定义-------一般对于太过复杂的数据类型,可以重新定义一个简单的或有辨识度的使用

​ typedef <数据类型> <你取的类型名>

unsigned long int a=10;  //数据类型过于复杂,可以使用typedef重新定义

typedef unsigned long int u_l_int;

u_l_int a=10;          //与unsigned long int a=10等价

5、extern

extern:用在变量或者函数的声明前,用来说此变量/函数是在别处定义的,要在此处引用

​ 默认情况下全局变量只能在定义它的文件中使用(从定义该全局变量开始到所在文件的文件尾), 但如果在另一个文件中将这个变量声明为外部变量,那么这个变量的作用域将被扩展到另外一个文 件中。

代码如下:

先在源文件中创建项目名为:main.c

#inlcude <stdio.h>
extern int a;
extern int Add(int x,int y);
int main()
{

 printf("%d\n",a);
    printf("%d\n",Add(3,2));
}

再在源文件中创建项目名为:test.c-------作为全局变量,函数定义的文件

int a=10;//全局变量
int Add(int x,int y)//
{
 return x+y;//函数定义
}

结果会输出10,5

6、拓展

变量的声明有两种情况

  • 一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
  • 另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。

例如:extern int a 其中变量 a 可以在别的文件中定义的。
​ extern int i; //声明,不是定义
​ int i; //声明,也是定义

定义分配存储空间,而声明不会

如何区分声明还是变量

extern告诉编译器变量在其他地方定义了
如果声明有初始化式,就被当作定义,即使前面加了extern
函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明
没有extern关键字的都是变量的定义

static:

static:声明静态变量

  • 修饰局部变量 使其生命周期变长(本质上改变了变量的存储类型)
  • 修饰全局变量 改变了全局变量的作用域,让静态的全局变量只能在自己的源文件内使用全局变量在其他源文件内部可以被使用,是因为全局变量具有外部链接属性。但是被static修饰后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量
  • 修饰函数 改变了函数的链接属性,将函数的外部链接属性变成了内部链接属性,使得函数只能在自己所在的源文件内部使用

解释1,代码如下:

#include <stdio.h>
void Add(int x)
{
    static int a=2;
    a++;
    printf("%d ",x+a);
}
int main()
{
    int i=0;
    for(i=0;i<3;i++)
    {
        Add(1);
    }
    return 0;
}

结果是4 5 6,大家知道int a=2是一个自动变量,在他作用域结束后,空间就会释放掉,a的值不能保存。

而加上static改变了他的生命周期,使他在整个项目结束前的一直存在,所以a的值会不断迭代

解释2,3,代码如下:(引用extern的内容,大家可以自行对比)

先在源文件中创建项目名为:main.c

##inlcude <stdio.h>
extern int a;
extern int Add(int x,int y);
int main()
{

 printf("%d\n",a);
    printf("%d\n",Add(3,2));
}

再在源文件中创建项目名为:test.c-------作为全局变量,函数定义的文件

static int a=10;//全局变量
static int Add(int x,int y)
{
 return x+y;//函数定义
}

产生结果如下:

最后注意:#define和#include不是关键字,是预处理指令

到此这篇关于C 语言基础之C语言的常见关键字的文章就介绍到这了,更多相关C语言的常见关键字内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中volatile关键字的深入讲解

    1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译.读取.存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取存储数据,不做优化,在我们做嵌入式开发的时候,该关键字作用很大,因为有时变量地址有可能是系统的一个外设地址,他的值的变化并不在程序控制范围内,随时有可能变化,因此需要对他进行声明,每次读取或者存储直接对地址进行操作,而不经过其他中间商,下面我以一个例子来分析vilatile

  • 深度理解C语言中的关键字static

    目录 一.函数和变量的多文件问题 1.1.为什么全局变量和函数需要跨文件访问 二.static修饰变量和函数 2.1.static修饰全局变量 2.2.static修饰局部变量 2.3.为什么局部变量具有临时性,全局变量具有全局性 总结 一.函数和变量的多文件问题 .h: 头文件,一般包含函数声明,变量声明,宏定义,头文件等内容(header) .c : 源文件,一般包含函数实现,变量定义等 (.c:c语言) 如果在一个源文件定义一个函数,然后再另一个源文件调用,这样的方式可行吗? 答案是可行的

  • C语言关键字const和指针的结合使用

    我们先定义三个变量 1.const int *p1 2.int const *p2 3.int *const p3 p1.p2.p3这三个指针都是指向int类型的,那它们有什么区别呢 写个代码测试一下 编译一下 可看到第11,12,16行报错,从中可得出以下结论: const int * 与 int const *是一样的效果,指向的内存是不能改变的,即指针指向的内容是只读的,或者说是一个常量.不过指向的位置是可以更改的,即p1和p2可以重新指向别的常量. 而char *const 刚好相反,表

  • C语言关键字总结解析

    C语言关键字总结 1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _Imaginary(注意bool 从来不是C语言的关键字) 2011年12月8日,ISO发布C语言的新标准C11,该标准新增了7个C语言关键字: _Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic 2.关键字列表 auto

  • 详解C++中的const关键字及与C语言中const的区别

    const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量.此变量只存在于那个文件中中,不能别其他文件访问.要是const变量能在其他文件中访问,必须显示的指定extern(c中也是)   当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间--这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0:相当于#define c 0:    当在当前文件之外使用

  • C语言入门篇--关键字static详解

    目录 1.修饰局部变量 1.1作用 1.2举例 (1)不加static (2)加static (3)静态局部变量的初始化只会进行一次 2.修饰全局变量 2.1作用 2.2举例 (1)不加static (2)加static 3.修饰函数 3.1作用 3.2举例 (1)不加static (2)加static 1.修饰局部变量 1.1作用 ststic修饰局部变量,会改变局部变量的生命周期,不改变作用域: 生命周期:和全局变量一样具有全局性,但在内存中的位置没有改变,还在在静态存储区中. 作用域:作用

  • C语言中volatile关键字的作用与使用案例教程

    一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化.编译器优化常用的方法有:将内存变量缓存到寄存器:调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令.对常规内存进行优

  • 探讨register关键字在c语言和c++中的差异

    在c++中: (1)register 关键字无法在全局中定义变量,否则会被提示为不正确的存储类. (2)register 关键字在局部作用域中声明时,可以用 & 操作符取地址,一旦使用了取地址操作符,被定义的变量会强制存放在内存中. 在c中: (1)register 关键字可以在全局中定义变量,当对其变量使用 & 操作符时,只是警告"有坏的存储类". (2)register 关键字可以在局部作用域中声明,但这样就无法对其使用 & 操作符.否则编译不通过. 建议不

  • C语言关键字union的定义和使用详解

    union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. 但在"联合"中, 各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度 .一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型. 当定义结构对象时,如果没有显式地初始化它们,则会采用一般初始化规则:如果该结构对象属于动态存储类型,那么其成员具有不确定的初始值

  • C语言按关键字搜索文件夹中文件的方法

    本文实例讲述了C语言按关键字搜索文件夹中文件的方法.分享给大家供大家参考.具体实现方法如下: 方法1: #include<iostream> #include<string> #include<io.h> using namespace std; void filesearch(string path,string mode) { struct _finddata_t filefind; if(path[path.size()-1]=='\\') path.resize

  • 如何在C语言的宏中使用类型关键字

    如下所示: 复制代码 代码如下: // 在C语言的宏中使用类型关键字#include <stdio.h> #define PRINT_AS_TYPE(i,TYPE) printf("%d ", (TYPE)i) int main(int argc, char *argv[]){ float x= 9; PRINT_AS_TYPE(x, int); return 0;}

  • C语言入门篇--注释,关键字typedef及转义字符详解

    目录 注释 1.注释意义 2.两种注释风格 2.1 C语言注释风格 2.2 C++注释风格 关键字typedef 1.注意 2.用法 语法结构 转义字符 1.转义字符及其含义 2.字面 转 特殊 3.特殊 转 字面 注释 1.注释意义 (1)代码中有不需要的代码可以直接删除,也可以注释掉. (2)有些代码比较难懂可以注释一下. 2.两种注释风格 2.1 C语言注释风格 /*xxxxxx*/ 一次可以注释一行或多行,但不能嵌套注释. eg: #include <stdio.h> int main

  • 一篇文章带你了解C语言中volatile关键字

    目录 C语言中volatile关键字 总结 C语言中volatile关键字 volatile关键字是C语言中非常冷门的关键字,因为用到这个关键字的场景并不多. 当不用这个关键字的时候,CPU可能会对我们的代码做一定的优化: 内存中的数据要放入CPU中进行运算或控制,而这个数据的值是被放入寄存器中,然后再将寄存器中的数据进行运算或控制的,对于一个死循环int flag=1;while(flag);来说:如果进行优化,则下次循环则不需要再次将flag内存中的值放入寄存器中,而是直接使用寄存器中已有的

随机推荐