Linux C基础 (3)

1、变量  
2、类型转换  
3、运算符

1、变量

 定义:意味着在内存中开辟空间
 通过数据类型定义的量,虚拟内存分配内存,进程是资源管理的重要单位

c语言的内存分配图:

如何定义一个变量?

 存储类型 数据类型 变量名;
 存储类型(一般省略):决定了开辟的空间在内存中的哪个分区
 数据类型:决定了要开辟的内存空间的大小
 变量名:开辟的内存空间的名字

1.1 局部变量

定义在函数体(任何函数体)内部的变量

1.2 全局变量

定义在函数体外部的变量

1.3 存储类型

 存储类型:auto、static、extern、register 
 auto:修饰的变量存储在栈区,只能修饰局部变量 
 extern:修饰的变量存储在静态区,只能修饰全局变量 
 static:修饰的变量存储在静态区(.bss和 .data统称为静态区),既可以修饰局部变量又可以修饰全局变量 
 register:修饰的变量存储在寄存器中,只能修饰局部变量 
 extern   外部变量声明,是指这是一个已在别的地方定义过的对象,这里只是对变量的一次重复引用,不会产生新的变量。 
 static   静态数据,数据存放在全局数据区,但作用域只是本文件/函数中,所以你可以在两个不同的文件/函数内部申明同名的static变量,但是它们是两个不同的全局变量。如果是定义在函数内,那么该对象具有无链接,函数外不能对其访问。如果是定义在函数外,那么该对象具有内部链接,其它程序文件不能对其访问
 auto     普通局部栈变量,是自动存储,这种对象会自动创建和销毁 ,建议这个变量要放在堆栈上面,调用函数时分配内存,函数结束时释放内存。一般隐藏auto默认为自动存储类别。我们程序都变量大多是自动变量。
 register 寄存器变量,请求编译器将这个变量保存在CPU的寄存器中,从而加快程序的运行.
     系统的寄存器是有限制的,声明变量时如:register int i.这种存储类型可以用于频繁使用的变量。
 总结: 
 (1)除了static和register修饰的局部变量,其它都存在栈区 
 (2)全局变量存在静态区 
 (3)静态变量存在静态区

1.4 初始化

在定义变量同时对变量进行赋值

 (1)int a = 10;//初始化
 (2)int a;
    a = 10;//赋值

 总结:
 (1)全局变量没有初始化其值默认为0
 (2)局部变量没有初始化其值为随机值
auto:修饰局部变量,存储在栈区
register:修饰局部变量,存储在寄存器中。建议将变量存储在寄存器中,可以提高程序的运行速度,最终是否存储在寄存器中,取决于编译器,如果没有寄存器,存储在栈区
extern:修饰全局变量,存储在静态区

程序可以有多个.c文件组成,但是一个程序只能有且仅有一个main函数

作用:告诉编译器,这个全局变量已经在其他文件定义过了

static:局部变量和全局变量都可以修饰,修饰的变量存储在静态区

1、static修饰局部变量,延长局部变量的生命周期,如果局部变量没有初始化,其值为0,如果初始化只 初始化一次

2、static修饰全局变量(函数),只能在本文件内使用(限制了全局变量的作用域)

1.5 生命周期和作用域

1.5.1 生命周期

从什么时候开辟空间到什么时候释放空间

1.5.2 作用域

使用范围:

(1)局部变量:

生命周期:从定义开始,到模块(大括号)结束
作用域:大括号内
static修饰的局部变量
生命周期:从定义开始,到程序结束
作用域:大括号内

(2)全局变量

生命周期:从定义开始,到程序结束
作用域:整个程序
static修饰的全局变量
生命周期:从定义开始,到程序结束
作用域:本文件内

2、类型转换

2.1 强制类型转换(我们自己转的)

2.1 隐式类型转换(编译器自动转)

横向箭头:不管我们有没有进行混合运算,都势必进行转换

注意:
(1)float使用的时候是当作double来使用
(2)char、short使用的时候是当作int来用的
竖向箭头:只有在进行混合运算的时候,才进行转换

3、运算符

单算移关与,异或逻条赋

单目运算符、算术运算符、左移右移、关系运算符、按位与、异或、按位或、逻辑运算符、条件运算符、赋值

3.1 算术运算符

+、-、*、/、%、++、--

注意:%不能用于浮点数

++在前:++a 先自加,再赋值
++在后:a++ 先赋值,再自加

3.2 关系运算符

>、<、==、!=、>=、<=

注意:0 < a < 5//error

等号的书写

注意:常量写在前面(常量不能被赋值,会有错误提示)

3.3 逻辑运算符

&&、||、!
表达式1 && 表达式2 
返回值为0或1
&&截断法则:有一个为假,结果就为假,前一个为假,后面就不进行运算了

3.4 sizeof运算符

sizeof(数据类型) or sizeof(变量名)
判断表达式1的值是否成立,如果成立,将表达式2的值作为整个表达式的值,反之将表达式3的值作为 整个表达式的值

3.5 三目运算符

表达式1 ? 表达式2:表达式3

3.6 逗号运算符

表达式1,表达式2,.....表达式n

从左至右依次计算表达式的值,然后将最后一个表达式的值作为整个表达式的值

注意:逗号运算符的优先级最低的,所以使用的时候加上括号

3.7 位运算符

操纵寄存器
&、|、~、^、<<、>>

3.7.1 与运算

3.7.2 或运算

3.7.3 取反

3.7.4 异或

相同为0,不同为1

3.7.5 左移

左移:高位丢弃,低位补0

3.7.6 右移

无符号数(正数):低位丢弃,高位补0

有符号数(负数):低位丢弃,高位补1

作业

1. 设int i=2,j=3,k=4,a=4,b=5,c=3;,则执行表达式(a=i<j)&&(b=j>k)&&(c=i,j,k)后,c值是(D)
    A)0 B)1 C)2 D)3
2、表达式10!=9的值是_1_。
3、a=1,b=2,c=3,d=4,则表达式a<b?a:c<d?a:d的值为_1_。
4、以下程序段的运行结果是 b = 2。
    int a=2,b=3;
    printf(a>b?”***a=%d”:”###b=%d”,a,b);
5.若以定义int a=25,b=14,c=19;以下语句的执行结果是__26 13 19_____-。
    a++<=25&&b--<=2&&c++<=18?printf(“***a=%d,b=%d,c=%d\n”,a,b,c):
    printf(“###a=%d,b=%d,c=%d\n”,a,b,c);
6.以下程序的输出结果是 0 0 4。
    Main()
    {int a=-1,b=4;
    k=(++a<0)&&!(b--<0);
    printf(“%d %d %d\n”,k,a,b);}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值