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语言的常见关键字内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-09-13

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语言中的关键字static

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

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语言按关键字搜索文件夹中文件的方法

本文实例讲述了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语言中volatile关键字

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

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

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

如何在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语言关键字union的定义和使用详解

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

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

const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量.此变量只存在于那个文件中中,不能别其他文件访问.要是const变量能在其他文件中访问,必须显示的指定extern(c中也是)   当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间--这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0:相当于#define c 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语言入门篇--关键字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. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译.读取.存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取存储数据,不做优化,在我们做嵌入式开发的时候,该关键字作用很大,因为有时变量地址有可能是系统的一个外设地址,他的值的变化并不在程序控制范围内,随时有可能变化,因此需要对他进行声明,每次读取或者存储直接对地址进行操作,而不经过其他中间商,下面我以一个例子来分析vilatile

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

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

浅析C语言中typeof关键字用法

前言 C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 下面是Linux内核源代码中一个关于typeof实例: #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) 1.当x的类型为是 int 时 _min1变量的数据类型则为

Java中volatile关键字的作用与用法详解

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile 关键字作用是,使系统中所有线程对该关键字修饰的变量共享可见,可以禁止线程的工作内存对volatile修饰的变量进行缓存. volatile 2个使用场景: 1.可见性:Java提供了volatile关键字来保证可见性. 当一个共享变量被volatile修饰时,它会保证修

Java并发编程volatile关键字的作用

日常编程中出现 volatile 关键字的频率并不高,大家可能对 volatile 关键字比较陌生,再深入一点也许是听闻 volatile 只能保证可见性而不能保证原子性,无法有效保证线程安全,于是更加避免使用 volatile ,简简单单加上synchronize关键字就完事了.本文稍微深入探讨 volatile 关键字,分析其作用及对应的使用场景. 并发编程的几个概念简述 首先简单介绍几个与并发编程相关的概念: 可见性 可见性是指变量在线程之间是否可见,JVM 中默认情况下线程之间不具备可见

深入解析Java中volatile关键字的作用

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用synchronized 修饰的方法 或者 代码块.

详解Java线程编程中的volatile关键字的作用

1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的. 2)禁止进行指令重排序. 先看一段代码,假如线程1先执行,线程2后执行: //线程1 boolean stop = false; while(!stop){ doSomething(); } //线程2 stop = true; 这段代码是很典型

总结C语言中const关键字的使用

什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 为什么引入const? const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点. const关键字使用非常的灵活,这一点和php差别很大,php中const用来在类中定义一个常量,而在c中,const因位置不同有不同的作用,因情景不同有不同的角色,使用起来也是非常的灵活. (1):const用来修饰普通的变量(指针变量除外)的时

详解C语言中const关键字的用法

关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点: 1.预编译指令只是对值进行简单的替换,不能进行类型检查 2.可以保护被修饰的东西,防止意外修改,增强程序的健壮性 3.编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编

浅析Go语言中的Range关键字

前言 相信用过Range的朋友们都知道,Go语言中的range关键字使用起来非常的方便,它允许你遍历某个slice或者map,并通过两个参数(index和value),分别获取到slice或者map中某个元素所在的index以及其值. 比如像这样的用法: for index, value := range mySlice { fmt.Println("index: " + index) fmt.Println("value: " + value) } 上面的例子足够

java volatile关键字作用及使用场景详解

1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShutDown被置为true后,doWork方法仍有执行.如用volatile修饰isShutDown变量,可避免此问题. public class VolatileTest3 { static class Work { boolean isShutDown = false; void shutdown(

深入多线程之:内存栅栏与volatile关键字的使用分析

以前我们说过在一些简单的例子中,比如为一个字段赋值或递增该字段,我们需要对线程进行同步,虽然lock可以满足我们的需要,但是一个竞争锁一定会导致阻塞,然后忍受线程上下文切换和调度的开销,在一些高并发和性能比较关键的地方,这些是不能忍受的..net framework 提供了非阻塞同步构造,为一些简单的操作提高了性能,它甚至都没有阻塞,暂停,和等待线程. Memory Barriers and Volatility (内存栅栏和易失字段 )考虑下下面的代码: 复制代码 代码如下: int _ans