选择与循环
关系表达式与逻辑表达式
算术运算符优先级高于关系运算符,关系运算符的优先级高于逻辑与和逻辑或
if语句
使用if嵌套语句时,要考虑“悬空的else“问题。C语言中的else子句从属于最靠近它的不完整的if语句。 在if语句中的语句列表前后加上花括号 ,可以防止错误。
switch
判断的一个变量可以等于几个值或几十个值,使用if会导致分支太多,这时可以考虑switch。 switch(表达式){ case 常量表达式1:语句1 case 常量表达式2:语句2 … default:语句n+1 } 当匹配到一个时,一下不会再匹配,直接执行下面的语句。所以需要在每条语句后面加上break; switch里的表达式只能是 整型表达式或字符型表达式。
goto语句
goto语句对应着jmp跳转,体现了循环结构的本质。 C中的while,do while,for循环在程序编译时,都要拆解成汇编语言的jmp跳转。goto语句也被称为无条件转向语句。 goto语句的使用场景分为两种:一种是向上跳转实现循环,另一种是向下跳转实现中间的代码不执行。 goto语句必须在一个函数内跳转 语句格式:”goto 语句标号",语句标号的命名规则和变量一样。 代码段内的语句执行,当PC指针指向goto语句时,会让pc指针指到语句标号处实现循环。
while语句
特点:先判断表达式,后执行语句。 为了避免程序进入死循环,在语句中需要有让表达式趋近于假的操作来使程序跳出循环。
windows下可以用rewind清空缓冲区,但在linux下却不能,解决方法是: while((ch=getchar())!=EOF&&ch!=’\n’)
do while语句
特点:先执行循环体,后判断循环条件是否成立。
for循环
C语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。 只有分号不能省略,for里面的表达式都可省略
continue语句
continue语句的作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行是否执行下一次循环的判断。
break
break语句的作用是结束整个循环过程,不再判断执行循环的条件是否成立。
数组
(1)具有相同的数据类型 (2)使用过程中需要保留原始数据 C语言为了方便操作这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。 一维数组的定义格式为 类型说明符 数组名[常量表达式] 分配的内存是数组大小*sizeof(数据类型) 数组名和变量命名规则一样 定义数组时,需要指定数组中元素个数,方括号内的常量表达式用来表示元素的个数,即数组长度。 常量表达式中可以包含常量和符号常量,但不能包含变量。C语言不允许对数组大小做动态定义。
一维数组在内存中的存储
定义语句int mark[100],在内存中的存放情况如图
每个数据元素占用的字节数,就算基类型的字节数一个元素占4字节 因为先定义的变量在内存中放在高地址,后存放的在低地址,又因为数组是往高地址方向增长的,所以数组越界会将原本定义的变量改变它的值,如图变为了8。 变量a与变量i之间的8字节的保护空间已被赋值(微软公司的编译器在不同的变量间设置了保护空间)。
在进行数组作为函数进行传递时,其数组长度时无法传递的,因为在接收的函数的数组的大小变为4字节,因为除了数组外,还需要传递数组长度,实际数组名中存储的是首地址,在void print(int b[],int n);b的括号内填任何东西都是没有意义的,当我们在函数内修改b,其实就是修改与b地址相同的实参,即二者在同一个位置。
栈空间和数组
windows操作系统单个函数的栈空间大小是1MB=1024KB=10 ^20B=1048576B
linux操作系统中单个函数的栈空间为10MB(可修改),数组是定义在栈空间上的,当数组的大小为260000时,就超过了单个函数的栈空间。所以在使用栈空间时,尽量不要使用过大的数组吗,如果需要,那么使用堆空间。
在main函数的栈空间所保存的a数组的地址是0x00F9FB80 00 00 00 00 … 0x00F9FB84 0x00F9FB88 0x00F9FB8C 0x00F9FB90 0x00F9FB94 . 0x00F9FB98 0x00F9FB9C 0x00F9FBA0 0x00F9FBA4 当进入print函数时,发现len的地址是0x00CFFA74 我们发现相对于a数组是低地址,所以对于函数的压栈顺序,先是main函数压栈,分配的函数栈内存空间是高地址,而后面压栈的print函数分配的内存空间是低地址。 进入print函数时,main函数的栈空间还存在。当函数执行完调用堆栈就会弹栈,分配的栈空间也会释放。
函数调用是值传递
二维数组
二维数组定义的一般形式 类型说明符 数组名[常量表达式] [常量表达式] 二维数组中的元素在内存中的存储规则是按行存储,即先顺序存储第一行的元素,后顺序存储第二行的元素。
可以用四种方法对二维数组进行初始化 1、int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 2、int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 3、int a[3][4]={{1},{5},{9}}; 4、int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
一共344=48个字节,按照行存储
二维数组在传递时,列数一定要写,因为二维数组传递时也是以执政变量形式传递的,列数要与主函数中二维数组a的列数相同。 行不能传递过去,列一定要写,二维数组的首地址传递过去。
字符数组
字符数组 char c[10]; 因为C语言规定字符串的结束标志为’\0‘,所以字符数组存储的字符串长度比字符数组少一个字节。
|