- 变量
定义:就意味着要在内存中开辟空间
c语言的内存分配图:
如何定义一个变量?
存储类型 数据类型 变量名;
存储类型:决定了开辟的空间再内存中的哪个分区
数据类型:表示要开辟的内存空间的大小
变量名:开辟的内存空间的名字
auto int a;
- 局部变量
定义在函数体(任何函数体)内部的变量
(2)全局变量
定义再函数体外部的变量
存储类型:auto、extern、static、register
auto:修饰的变量存储在栈区,只能修饰局部变量
extern:修饰的变量存储在静态区(.bss和.date统称为静态区),只能修饰全局变量
static:修饰的变量存储在静态区,局部变量和全局变量都可以修饰
register:修饰的变量存储在寄存器中,只能修饰局部变量
总结:
- 除了static和register修饰的局部变量,都存在栈区
- 全局变量存在静态区
- 静态变量存在静态区
初始化:在定义变量时对变量赋值
(1)int a = 10;//初始化
(2)int a;
a = 10;//赋值
案例1:
全局变量没有初始化其值默认为0
局部变量没有初始化其值为随机值
auto:修饰局部变量,存储在栈区
register :修饰局部变量,存储在寄存器中,建议将变量存储在寄存器中,可以提高程序的运行速度,最终是否在寄存器中,取决于编译器,如果没有寄存器,就存在栈区
extern:修饰全局变量,存储在静态区
声明外部文件的全局变量
目的是告诉编译器,这个全局变量已经在文件的外部定义过了
程序可以由多个.c文件组成
gcc extern2.c extern3.c; // a.out:一个程序
extern2.c 和extern3.c是组成程序的文件,假设在extern2.c中定义一个全局变量,在extern3.c也可以使用这个变量
注意:一个程序只能有且仅有一个main函数
static:修饰的变量存储在静态区,既可以修饰局部变量也可以修饰全局变量‘
- static修饰全局变量,只能在本文件内使用(或者:限制了全局变量的作用)
2.static修饰局部变量,延长了局部变量的生命周期,如果局部变量没有初始化,其值为0,如果初始化只会被赋值一次
2、生命周期和作用域
生命周期
从什么时候开辟空间到什么时候释放空间
作用域
使用的范围
局部变量:
生命周期:从定义开始,到模块(大括号)结束
作用域:大括号内
static修饰的局部变量:
生命周期:从定义开始,到程序结束
作用域:大括号内
全局变量:
生命周期:从定义开始,到程序结束
作用域:整个程序
static修饰的全局变量:
生命周期:从定义开始,到程序结束
作用域:本文件内
3、数据类型转换
1、强制类型转换(我们自己转的)
案例1、比如将int转成float
2、隐式类型转换(编译器自动转)
横向箭头:不管我们有没有进行混合运算,都势必进行转换
注意:float使用的时候是按照double来使用的
同理,short、char是按照int来使用的
竖向箭头:只有在进行混合运算时,才进行转换
案例1:
案例2:
4、运算符
单算移关与,异或逻条赋
算术运算符、关系运算符、逻辑运算符、位运算符、sizeof、三目运算符、逗号运算符
1、算术运算符
+ 、-、 *、 /、 %、 ++、 --
注意:%不能用与浮点数
++在前:++a,先自加,再赋值
++在后:a++,先赋值,再自加
案例1:
案例2:
2、关系运算符
> 、< 、>=、 <=、==、 !=
案例:
注意:0 < a < 5 //error
等号的书写:
3、逻辑运算符
&& 、|| 、 !
表达式1 && 表达式2
&&截断法则:表达式1为假,结果就为假,表达式2不执行
表达式1 || 表达式2
||截断法则:表达式1为真,结果就为真,表达式2不执行
4、sizeof运算符
sizeof(数据类型)或sizeof(变量名)
注意:sizeof不是函数,sizeof是运算符或者关键字
5、三目运算符
表达式1?表达式2 :表达式3
判断表达式1是否成立,如果成立,将表达式2的值作为整个表达式的值,否则执行表达式3,并将结果作为整个表达式的值
6、逗号运算符
表达式1,表达式2,表达式3 ……….表达式n;
从左至右依次执行每个表达式,并将表达式n的值作为整个表达式的值
案例1:
案例2:
注意:逗号运算符的优先级是最低的,使用的时候加上括号
自定义宏,用三目运算符实现求两个数中比较小的数
#define MIN(a,b)( (a) > (b) ? (b) : (a) )
可以练习一下一下代码:
若有以下定义语句:int a=5; printf(“%d\n”,a++); 则输出结果是()
- 若定义x和y为double型变量,则表达式x=1, y=x+3/2的值是()
(3)int c1=1,c2=2,c3;c3=1.0/c2*c1;则执行后,c3中的值是 ()
(4) 有整型变量x,单精度变量y=5.5,表达式x=(float)(y*3+((int)y)%4)执行后,x的值为()
(5)设int i=2,j=3,k=4,a=4,b=5,c=3;,则执行表达式(a=i<j)&&(b=j>k)&&(c=i,j,k)后,c值是
(6) char ch 130;
printf(“%d\n”,ch);
(7)unsigned char ch 260;
printf(“%d\n”,ch);