C语言的部分操作符概述与static概述

本文介绍了C语言中的单目、双目和三目操作符,包括取反、负值、正值、取地址、 sizeof及自增自减等,并通过实例解析了它们的用法。同时,详细探讨了static关键字修饰局部变量和全局变量的效果,解释了静态存储区的概念,以及static如何改变变量的生命周期和链接属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

简单认识单目操作符

双目操作符

三目操作符

static修饰局部变量效果与原理

static修饰全局变量的效果



在C语言中,有各种各样的操作符,它们的功能有很多但是我们可能并不是完全清楚,比如在使用Scanf函数的时候,在双引号和逗号后头的&就是一个单目操作符,下面则是对C语言中的操作符与关键字的大体概述与作用记录。

简单认识单目操作符

单目操作符是啥?痞老板吗?

 

单目操作符其实指的是只有一个操作数的操作符,简而言之,他只需要一位“操作员”就可以产生效果。

单目操作符种类如下


----- 逻辑反操作

比如  成绩好!=好学生,等于的逻辑被!逆转成了不等于。

- ----- 负值

+-----正值

&-----取地址


sizeof-----操作数的类型长度(以字节为单位)

这个操作符有个非常实用的方法,借助它的性质可以求出一个数组内部的元素数量

比如某个数组里的元素比较多,懒得一个个去数

用数组的字节长度除以其中单个数据类型所占字节的长度就可以得到其中元素的个数了。


++ ----- 其意义在于为它的操作数的值进行+1运算,有前置与后置分别。

前置  (++a) 计算规则是先+1,加完了以后再使用

int a,b;
a = 0,b = 1;
b =++a;
//a会先+1,然后赋值给b
printf ("%d %d",a,b);
结果为 1 1

后置 (a++)计算规则是先使用后++,用完后,再+1

int a,b;
a = 0,b = 1;
b = a++;
//此处先将还未+1的a赋值给b,赋值完毕后再+1
printf("%d %d",a,b);

输出结果为:b=0,a=1

--   -----前置与后置与++同理,只不过是-1
 

双目操作符

 与单目操作符同理,就是需要两个操作数的操作符

不做完全细述

双目操作符
&&逻辑 与-并且

||   

逻辑 或-或者
%取余数
*乘法运算
/除法运算
.结构体成员运算符
==等于
!=不等于

三目操作符

 exp1?exp2:exp3  条件操作符

int r = A>B?A:B

A是否大于B?如果大于取A,小于取B

其本质是,?前的表达式1为真,取表达式2;?前表达式为假,取表达式3.

static修饰局部变量效果与原理

 我们想利用自定的函数来生成一串2-12的数字

 请先观察如下代码

程序并没有如我们所愿,a的值并没有一次增加1

 我们可以看到,a的生命周期在整个程序中只存在于Add()函数中,程序不会保存每一次+1后a的数值,a在Add完成一次后就被销毁了,每一次运行Add时才会重新声明一次a,所以程序输出了11个2。

当我们用staic修饰Add中的变量a时会发生什么?

 成功了!程序如我们所愿将每一次在Add函数中+1后的a依次输出了!那么这是为什么呢?

static 静态的当其修饰局部变量的时候,局部变量出了作用域,是不销毁的。因为其本质上修饰局部变量的时候,改变了变量的存储位置。将其生命周期变长,变得跟程序一样长。

static修饰后的变量数据,放置于内存的静态区,在这个程序的生命周期结束后才销毁。

静态区又是啥?

内存中有三个数据存储区域,分别为:栈区,堆区,静态区。

像是Add()中的变量a,它的数据通常存储于栈区中。

栈区:进入创建,出去销毁,装局部变量

堆区:当程序运行空间不足时,由程序员手动开辟空间进行扩展。

其中,静态区内的数据的生命周期会变得和整个程序一样长。

这样,a的生命周期会被static抛入静态区,跟着整个程序的生命周期运转,它的值不会再因为出了Add的作用域而被销毁。

static修饰全局变量的效果

当static修饰全局变量的时候会发生什么呢?

全局变量:生成于main函数之外,它可以作用于整个程序。


想象一下以下场景,我们在一个源文件中新建了两个项目,其中一个项目的一个函数我们在另一个项目里也想使用,但是重新再写一遍有些麻烦,能不能直接把隔壁项目的函数拿来用呢?

extern:“当然可以!拿来吧你!”

声明外部函数的时候记得把全家老小带过来

extern声明外部符号,实现脚本之间的联动,修饰全局变量(在main之外)全局变量是具有外部链接属性的。

只要将需要使用的函数复制粘贴到另一个项目的时候在前面加个extern就可以了!


但有时候,我们不一定想去使用其他项目里的函数,我们也不希望它具有外部链接属性,它只要做自己分内的事就好了的时候应该怎么办呢?

当static修饰全局变量之后,全局变量的外部链接属性会变成内部链接属性,其他源文件(.c)就不能再使用到这个全局变量了。

函数也有外部链接属性,static也可以对函数生效。被static修饰的时候外部链接属性就变成了内部链接属性,与局部变量一样。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值