目录
简单认识单目 *** 作符
双目 *** 作符
三目 *** 作符
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修饰的时候外部链接属性就变成了内部链接属性,与局部变量一样。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)