------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员-iOS基础-C语言基础(二)
一、C语言基础语法
1、数据
a.分类
静态数据:一般指永久性数据,存储时间长,以文件形式存储在硬盘上
动态数据(临时数据):程序运行过程中产生的临时数据,一般存储在内存中
程序运行时加载到内存,计算机关闭或程序结束后会被清除
b.数据的单位
B/KB/MB/GB/TB...
1KB=1024B,依此类推
1B=8bit(位)
c.数据类型
基本数据类型:整型int;单精度浮点float,双精度浮点double,字符型char
指针类型:指针型void*
构造类型:数组;结构体struct;共用体union;枚举enum
空类型:void
d.不同类型数据占据的存储空间(64位操作系统下,Mac是64位操作系统)
char字符型:1B
int整型:4B
float单精度浮点:4B
double双精度浮点:8B
2、常量
a.定义:固定的数据
b.分类:int:整型
double:双精度浮点型,就是小数,非float型以外的所有小数
float:单精度浮点型,精确度低,也是小数,以f结尾
char:字符型,单引号括起来的一个字符
字符串常量:用双引号括起来的一个或多个字符
3、变量
a.定义:可变的数据
b.定义变量:目的:在使用前定义;
在内存中分配一块存储空间给变量方便存储;
如果定义多个变量,就为多个变量分配不同的存储空间
格式:变量类型 变量名;
注:变量名属于标识符;
不同类型的变量占用不同大小的存储空间,声明变量类型可以合理分配内存
c.变量赋值:赋值符号:=
第一次赋值有初始化的作用,在初始化前,不得使用变量进行操作
举例:b=a=40;=>a=40;b=a;
d.打印输出:printf函数
占位符:%d或%i整型变量;
举例:printf("分数是%d\n",score);
%f浮点型;用来输出小数,默认6位
%.2f 两位小数
%.4f 四位小数
%c字符型
e.变量的作用域:从定义的那一行开始到所在的代码块结束
内存中的存储空间从定义的那一行进行分配
作用域最近原则
注意初始化新分配内存和访问内存的区别
举例:int score=100;
{
int score=200;
{
score=50;
}
printf("score=%d\n",score);
}
printf("score=%d\n",score);
输出结果为50,100
举例:int score=100;
{
int score=200;
{
int score=50;
}
printf("score=%d\n",score);
}
printf("score=%d\n",score);
输出结果为200,100
原因:
第一个示例中score=50在于并未新开辟内存空间存储
而是根据就近原则对之前最近的一个score变量进行访问并更改
因此将200变更为50,虽然该段代码执行完成后已经释放内存
但更改后的score=50并未释放,因此会输出50;
第二个示例中50的score变量为新声明的变量,在内存中是单独开辟空间存储
所在的大括号执行完毕后即被释放,因此第一个输出的score变量仍为200。
f.局部变量及全局变量
局部变量:定义在代码块中,仅从定义开始到所在的代码块结尾的范围内有效
全局变量:定义在代码块以外,从声明的那一行开始以后所有的代码都可以使用
g.大括号的作用
大括号可以对代码段进行区分,提高代码的可读性
另外对于已经执行完毕的C语言代码,系统会自动释放其内存
因此对于简单使用后续不在使用的变量和代码,应该用大括号包围起来,以便在运行后释放内存资源
h.值交换操作练习(a=11,b=10交换成a=10,b=11)
第三方变量交换法
<span style="font-size:14px;">int a=11;
int b=10;
int temp;
temp=a;
a=b;
b=temp;
printf("%d,%d",a,b);
</span>
i.变量内存分析
1)字节和地址
内存以字节为单位进行存储
不同类型的变量占用的字节是不一样的
数据越大,占用的字节数越多
2)变量的存储
内存寻址由大到小,优先分配较大的地址给变量
变量越先定义,内存地址越大
地址是分配的多个字节中最小的那一个
取得变量的地址:&变量名
打印地址的占位符用%p,如:printf("a的地址是:%p\n",&a);
j.没有初始化的变量不要拿来使用,必须先初始化再使用。
二、C语言基本运算
1、算术运算
+(加法/正数)
-(减法/负数)
*(乘法)
/(除法)整数除以整数,结果还是整数,1/2=0
%(取余)整数相除之后的余数;%两侧只能是整数;正负值取决于%左侧的数值
使用细节:1.大范围类型值赋值给小范围类型,会自动转换类型并丢失精度,如:int a=10.8;
2.强制类型转换,在值前加(小类型),如:int b=(int)10.6;
3.自动类型提升,小范围类型值与大范围类型值相运算时,会自动提升小范围类型为大范围类型
如double c = 10.6 + 6;
4.运算结果的类型与参与运算的两个值的类型一致
2、赋值运算
1)简单赋值=
2)复合赋值 +=/-=/*=/(/=)
如:a += 5; => a = a + 5;
a *= 5; => a = a * 5;
a += 5 + 6 + 4 => a = a + 5 + 6 + 4;
3)运算符顺序:先(),再*/,后+-,同级按从左到右
3、自增自减:最终结果:在变量a基础上增加1或者减小1。注意:常量不能自加自减
a++/a--
++a/--a
区别:运算时a++/a--只用a的值参与运算,++a/--a使用增加或减小后的值参与运算
示例1:
int b;
int a=10;
b=++a;
//则a=b=11;先自加,再赋值
int b;
int a=10;
b=a++;
//则a=11,b=10,先赋值,再自加
示例2:
int b;
int a=10;
b=(a++)+(++a);
则a=12,b=22;
a++位置为a的初始值10,但是a已经自增至11
在++a位置再次自增至12,所以b=22
b=(a++)+(++a);实际也等价于
b=a++;
b+=++a;
4、sizeof函数
作用:计算一个变量或者常量或者数据类型所占的内存字节数
格式:
sizeof(变量\常量)
sizeof 变量\常量
sizeof(数据类型),如int size=sizeof(char);
不能是 sizeof 数据类型
5、关系运算(比较运算)
作用:条件判断,在某个条件成立的情况下才执行某一段代码
条件成立:真;条件不成立:假。
数值都有真假性:非零值都是真,0为假。
比较运算,条件成立就返回1,真;条件不成立就返回0,假
比较运算符:>/>=/</<=/==/!=
使用注意:==和!=优先级相同,</<=/>/>=优先级相同,前者优先级低于后者
相同优先级结合方向:从左往右;关系运算符的优先级小于算术运算符
6、逻辑运算
结果:1真/0假
1.逻辑与 &&:同真为真,有假为假
示例:
int a=10,b=10;
int c=(a<5)&&(++b>=11);
结果a=10,b=10,c=0
因为a<5不成立,c一定为0,所以右侧不会执行
2.逻辑或 ||:有真为真,同假为假
示例:
int a=10,b=10;
int c=(a>5)||(b++ - 11);
结果a=10,b=10,c=1
因为a>5成立,c一定为1,所以右侧不会执行
3.逻辑非 !:原真则假,原假则真
C语言允许如下:
int a=!10;
a=0
7、三目运算符
格式:条件?数值1:数值2
条件成立返回数值1,不成立返回数值2