C语言实例梳理讲解常用关键字的用法

目录
  • 一、C语言关键字详解
    • 1. sizeof
    • 2. const
    • 3. static
    • 4. extern
    • 5. volatile
    • 6. typedef
    • 7. enum
    • 8. continue
    • 9. break

一、C语言关键字详解

1. sizeof

sizeof相信大家并不陌生,其作用就是计算变量所占用的内存空间大小。sizeof的用法看着和函数很相似,但sizeof的真实身份确是:sizeof既是关键字,也是运算符,但不是函数! 这点需要大家牢记。还有非常重要的一点就是 sizeof中的表示式编译器不会进行编译处理,其原因就是sizeof是在编译的时候执行的,而C语言的运算符计算是在程序运行的时候执行的,故 sizeof里面的表达式是不会被执行的。下面以一个实际的程序来为大家演示一下。

源代码:

#include <stdio.h>
int main()
{
    int a = 3, b = 0;
    b = sizeof(a++);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

运行结果:

a = 3, b = 4

看上面的程序就知道,虽然在sizeof表达式中变量 a 进行了自增1操作,但是 ++ 运算符是在程序执行的时候运行的,而sizeof表达式是在程序编译的时候运行的,所以 ++ 操作并不会被执行。

2. const

const关键字的作用就是将变量常量化。大家都知道变量是可以进行随意赋值的,但是常量不可以。而被const修饰的变量是不能够被赋值的,尽管如此,但是我们依旧有方法可以将其进行改变,看下面例子:

源代码:

#include <stdio.h>
int main()
{
   const int a = 3;
   //a = 4;    //程序报错,因为变量a被const修饰成只读的变量了。
   int *p = &a;
   *p = 8;
   printf("a = %d\n", a);
    return 0;
}

运行结果:

a = 8

上面讲到const修饰的变量是不能够被赋值的,因此程序中注释的那一行会报错,这是合理的。在下面我们定义了一个指针指向变量 a ,并且通过指针的方式来改变变量 a 地址里面的内容,这样是合理的。我们可以这样来理解,首先定义一个变量 a , 那么这个变量 a 是具有可读可写属性的,用 const 对 a 进行修饰,可以理解成 const 去掉了变量 a 的写属性,只保留了读属性,所以不能再对 a 进行赋值了。接着我们定义了一个指针变量指向 a 的地址,这个新定义的指针变量没有被 const 修饰,所以具备可读可写属性,然后通过指针变量来对地址里面的值进行操作,相当于是间接改变了变量 a 里面的内容。所以const的作用可以简述成一句话,那就是 const修饰谁,谁不能被直接赋值,但是可以通过间接的方式来改变其内容。

3. static

static修饰的变量会存储在静态存储区,静态存储区默认值是0。

static的三个作用:

  • static修饰的局部变量只会被初始化一次。
  • static修饰的全局变量只能在本文件中被使用,不能在其他文件中使用。
  • static修饰的全局函数只能在本文件中被使用,不能在其他文件中使用。

作用1将在下面的程序示例为大家演示,作用2和作用3将结合 extern 关键字为大家演示。

源代码:

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

运行结果:

a = 3, b = 3
a = 4, b = 3

上面程序中,就是调用了两次 func() 函数,func() 函数的功能就是定义两个变量,并且执行加1操作,然后打印输出。变量 a 因为被 static 修饰,所以 a 被存储在静态存储区,静态存储区中的内容是要等程序结束完才会被释放。并且 a 只会在程序第一次进来的时候被初始化一次,后续再进来的时候不会再执行初始化操作,且保留函数上一次退出的时候的值。而变量 b 没有被 static 修饰,所以存储在栈区,栈区中的内容会在该函数结束的时候被回收,所以每次执行func() 函数变量 b 都会被重新赋值。

4. extern

extern一般只有在多文件编程的时候才会被用到,是用来修饰变量或函数的,并且告诉编译器,该变量或函数是在别的文件中被定义的,下面用一个实例来进行具体说明:

文件1源代码:

int a = 10;
int add(int a, int b)
{
	return a+b;
}

文件2源代码:

#include <stdio.h>
extern int a;
extern int add(int a, int b);
int main()
{
	printf("a = %d, sum = %d\n", a, add(10, 20));
}

文件1和文件2同时运行结果:

a = 10, sum = 30

上面程序中在文件2中调用了文件1的变量和函数,因为变量和函数都是在文件1中定义的,所以我们想要引用到文件1中的变量或函数时就必须要用extern进行声明,否则就会报错。

假设我们在文件1中将变量和函数用static进行修饰,文件2不变。

改变后的文件1源代码

static int a = 10;
static int add(int a, int b)
{
	return a+b;
}

这个时候再同时运行文件1和文件2就会报错。报错的原因就是在文件2中找不到变量和函数。其原因就是被static修饰的变量或函数只能在该文件中使用。

5. volatile

volatile的作用一句话概述的话就是防止编译器优化。 cpu读取变量的时候是先从内存中读取到寄存器,再从寄存器中读取变量的值,但是可能在一些情况下编译器认为某些变量的值没有发生变化,因此就省略了从内存中读取变量的操作,直接从寄存器中读取。但是这些值可能会被外部环境所改变,比如说是在中断或者别的线程里面改变,这个时候如果编译器没有及时更新变量在寄存器中的值就会导致读取错误。但如果将这个变量用volatile关键字修饰的话就可以保证cpu在读取变量的时候一定会从内存中读取到寄存器,这样就可以保证读取变量的值不出错。

6. typedef

typedef的作用就是为已有类型取别名,注意typedef只是取别名,而不是创造出一个新的类型。

源代码:

#include <stdio.h>
int main()
{
    typedef int u32;
    u32 a = 10, b = 20;   //等价于 int a = 10, b = 20;
    printf("a+b = %d\n", a+b);
    return 0;
}

运行结果:

a+b = 30

上面代码中使用 typedef 将 int 类型取名为 u32,对于编译器而言,只要是看到 u32 都会默认将其转换为 int 。取别名主要是方便我们来写和阅读代码,而并不会说是创造了新类型。

7. enum

enum就是枚举类型,因为我们有的变量可能取值范围就是那么几个值,不会出现别的值。像这种情况下我们就最好使用枚举类型,注意的是枚举的值默认是从0开始的,后面的值以此增加,如果我们对枚举变量中某个值进行手动赋值,那么被手动赋值的后面那个值会在此基础上加1。举个实例为大家具体讲解:

源代码:

#include <stdio.h>
/*0, 1, 2, 3, 4, 5, 6*/
enum weekday{Monday, Tuesday, Wednesday, Thursday, Friday, Staurday, Sunday};
/*0, 1, 5, 6, 7*/
enum num{ONE, TWO, THREE=5, FOUR, FIVE};
int main()
{
    enum weekday day = 3;
    day = Thursday;
    enum num number = FIVE;
    printf("day = %d, number = %d\n", day, number);
    return 0;
}

运行结果:

day = 3, number = 7

8. continue

continue用法两大注意项:

(1)continue只能用在循环体当中。

(2)continue的作用是结束本次循环,进入到下一次循环。

源代码:

#include <stdio.h>
int main()
{
    int i;
    int a[5] = {12, 13, 5, 11, 10};
    for(i = 0; i < 5; i++){
        if(a[i] < 10){
            continue;
        }
        printf("a[%d] = %d\n", i, a[i]);
    }
    return 0;
}

运行结果:

a[0] = 12
a[1] = 13
a[3] = 11
a[4] = 10

从上面程序可以看出,a[2] 的结果是 5,所以结束本次循环进入下次循环,所以当 i 的值为 2 的时候不会输出打印。

9. break

break用法两大注意项:

(1)break只能用于循环体或 switch…case 语句中。

(2)break的作用是跳出本循环体外,值得注意的是如果有多层循环嵌套的话,break是只能跳出它所在的那一层循环体。

源代码:

#include <stdio.h>
int main()
{
    int i;
    int a[5] = {12, 13, 5, 11, 10};
    for(i = 0; i < 5; i++){
        if(a[i] < 10){
            break;
        }
        printf("a[%d] = %d\n", i, a[i]);
    }
    return 0;
}

运行结果:

a[0] = 12
a[1] = 13

从上面程序看,a[2] 的结果是 5,break就直接跳出了循环体,然后程序就结束运行了。因此从这里就能够看出continue关键字和break关键字最大的区别了,这两个关键字的区别也是常考的,大家可以好好熟悉。

到此这篇关于C语言实例梳理讲解常用关键字的用法的文章就介绍到这了,更多相关C语言关键字内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

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

  • 浅析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变量的数据类型则为

  • c语言static关键字用法详解

    目录 1.static修饰全局变量 2.static修饰函数 3.static修饰局部变量 总结: 1.static修饰全局变量 我们创建两个源文件,一个test.c,一个main.c 现在我们在test.c文件下定义一个全局变量 int g_val = 100; 我们在main.c下进行调用打印g_val我们能访问到g_val吗? 答案是可以的 如果给g_val加上static修饰我们还能再main.c下访问到吗? static int g_val = 100; 这时候答案是不行的! 因此我们

  • C语言详细分析讲解关键字const与volatile的用法

    目录 一.const 只读变量 二.const 全局变量的分歧 三.const 的本质 四.const 修饰函数参数和返回值 五.volatile 解析 六.小结 一.const 只读变量 const 修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const 修饰的全局变量在全局数据区分配空间 const 只在编译期有用,在运行期无用 const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边. 二.const 全局变量的分歧 在现代C语言编

  • C语言详细分析讲解关键字enum与sizeof及typedef的用法

    目录 一.枚举类型的使用方法 二.sizeof 关键字的用法 三.typedef 的意义 四.小结 一.枚举类型的使用方法 enum 是 C 语言中的一种自定义类型 enum 值是可以根据需要自定义的整型值 第一个定义的 enum 值默认为 0 默认情况下的 enum 值是在前一个定义值的基础上加 1 enum 类型的变量只能取定义时的离散值 enum 中定义的值是C语言中真正意义上的常量 在工程中 enum 多用于定义整型常量 下面看一段 enum 的使用代码吧: #include<stdio

  • C语言实例梳理讲解常用关键字的用法

    目录 一.C语言关键字详解 1. sizeof 2. const 3. static 4. extern 5. volatile 6. typedef 7. enum 8. continue 9. break 一.C语言关键字详解 1. sizeof sizeof相信大家并不陌生,其作用就是计算变量所占用的内存空间大小.sizeof的用法看着和函数很相似,但sizeof的真实身份确是:sizeof既是关键字,也是运算符,但不是函数! 这点需要大家牢记.还有非常重要的一点就是 sizeof中的表示

  • Java超详细分析讲解final关键字的用法

    目录 基本介绍 final细节01 final细节02 基本介绍 final 可以修饰类.属性.方法和局部变量. 在某些情况下,程序员可能有以下需求,就会使用到final: Base Sub 类 1)当不希望类被继承时,可以用final修饰. 2)当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字 修饰.[案例演示:访问修饰符 final 返回类型方法名] 3)当不希望类的的某个属性的值被修改,可以用final修饰.[案例演示: public final dou

  • Python调用R语言实例讲解

    网络上经常看到有人问数据分析是学习Python好还是R语言好,还有一些争论Python好还是R好的文章.每次看到这样的文章我都会想到李舰和肖凯的<数据科学中的R语言>,书中一直强调,工具不分好坏,重要的是解决问题的思路,就算是简单的excel,也能应付数据分析中的大部分问题.再者Python和R本来就没有什么好对比的,一门是计算机工程语言,一门是统计语言,只有将两者结合起来,才能发挥更大的威力,不是吗,对于数据分析的人来说,难道不是两样都要掌握的吗? rpy2是Python调用R程序的模块,旨

  • Java调用R语言实例讲解

    R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R. Rserve作为一个package发布在CRAN上,可以直接使用install.packages("Rserve")进行安装.需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供

  • C语言超详细讲解栈与队列实现实例

    目录 1.思考-1 2.栈基本操作的实现 2.1 初始化栈 2.2 入栈 2.3 出栈 2.4 获取栈顶数据 2.5 获取栈中有效元素个数 2.6 判断栈是否为空 2.7 销毁栈 3.测试 3.1测试 3.2测试结果 4.思考-2 5.队列的基本操作实现 5.1 初始化队列 5.2 队尾入队列 5.3 队头出队列 5.4 队列中有效元素的个数 5.5 判断队列是否为空 5.6 获取队头数据 5.7 获取队尾的数据 5.8 销毁队列 6.测试 6.1测试 6.2 测试结果 1.思考-1 为什么栈用

  • C语言详细分析讲解关键字goto与void的作用

    目录 一.关于goto 二.void 的意义 三.小结 一.关于goto 高手潜规则:禁用 goto 项目经验:程序质量与 goto 的出现次数成反比 最后的判决:将 goto 打入冷宫 下面看一段 goto 副作用分析的代码: #include <stdio.h> #include <malloc.h> void func(int n) { int* p = NULL; if( n < 0 ) { goto STATUS; } p = (int*)malloc(sizeof

  • C语言实例讲解四大循环语句的使用

    目录 一.do…while()循环 1. 图示流程 2. 代码流程 3. 示例代码1到100求和) 二.while()循环 1. 图示流程 2. 代码流程 3. 示例代码(1到100求和) 三.for()循环 1. 图示流程 2. 代码流程 3. 示例代码(1到100求和) 四.goto循环 1. 代码流程 2. 示例代码-1(1到100求和) 3. 示例代码-2 一.do…while()循环 1. 图示流程 从上面图示 do…while() 语句流程中可以看出,do…while() 语句会先进

  • C语言实例讲解嵌套语句的用法

    目录 一 .if 嵌套 二.比较ab两个数值大小 三.总结 一 .if 嵌套 格式: if ( 条件 ){    if( 嵌入一个条件 ){    else    {就近原则,对应上面的if}} else{ 对应最开始那个if }} 代码: #include <stdio.h> int main (void) { int score; // 定义一个分数变量 printf("请输入您的分数:"); scanf("%d",&score); // 键

随机推荐