循环
while循环
#include <stdio.h>
int main()
{
int i=10;
while(i)
{
printf("%d\n",i--);
}
}
while类似for循环的精简版本,for负责循环次数明确的情况,while循环负责只循环条件而不确定循环次数的情况。
while(表达式)
{
表达式结果为真执行循环体。
}
for(; [] ;)
{
}
do while循环
do while是一种先执行循环体,再判断循环条件的一种循环,循环体至少执行一次,而for和while的循环体可能一次都不执行。
do{
循环体;
}while(表达式);
#include <stdio.h>
int main()
{
int i=0;
do{
printf("%d\n",i++);
}while(i<10);
}
跳转语句
goto标签
- goto可以跳转到函数内的任意位置,既可以几前,也可以向后。
- goto是一种非常灵活、强大但也非常危险的语句,因为goto可能会破坏已经设计好的分支和循环,很多公司都禁止使用goto。
- 在驱动编程中,goto有它无代码替代的作用,当驱动程序出现异常时,goto语句非常适合用来释放资源。
#include <stdio.h>
int main()
{
int i = 0;
loop:
printf("%d\n",i++);
if(i<10) goto loop;
}
break
- 在switch语句中可以关闭执行开关。
- 在循环语句可以跳出一层循环。
#include <stdio.h>
int main()
{
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
printf("%d %d\n",i,j);
if(j>5)
{
break;
}
}
}
}
continue
结束本次循环(循环体中continue后的语句不再执行),进入下一次循环(循环并没有结束)。
注意:break,continue 可以提高程序的运行效率。
#include <stdio.h>
int main()
{
for(int i=0; i<10; i++)
{
if(i%2)
{
continue;
}
printf("%d\n",i);
}
}
return
- 把一个数据返回给函数的调用者。
- 终止函数的执行。
数组
数组就是变量的集合,是一种指定义变量的方法。
一维数组
-
一维数组:把变量排成一排。
-
定义:类型 数组[数量];
int arr[5] <=> int n1,n2,n3,n4,n5; 数组的变量,值也是不确定的,为了安全需要初始化。
-
使用:数组名[编号];
arr[0],arr[1],arr[2],arr[3],arr[4]; 编号也叫下标,范围:0~数量-1。
#include <stdio.h> int main() { int arr[] = {1,2,3,4,5,6,7,1,1,1,1,1,1,1}; for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) { printf("%d\n",arr[i]); } }
-
遍历:配合循环语句,使用循环变量当作数组的编号。
#include <stdio.h> int main() { int arr[10]; for(int i=0; i<100000; i++) { printf("%d\n",arr[i]); } }
-
初始化:类型 数组[数量] = {v0,v1,v2,v3…};
1、如果初始化数据不够,编译器会自动补零。 2、如果初始化数据过多,编译器会丢弃多余的数据并给出警告。 3、对数组初始化时,数组的数量可以省略,编译器会统计出初始化数据的个数然后再告诉数组。
#include <stdio.h> int main() { int arr[10]; arr[11] = 10010; printf("%d\n",arr[11]); printf("开始初始化...\n"); for(int i=0; i<=10; i++) { arr[i] = 0; } printf("初始化结束...\n"); }
数组越界
- C语言中数组可以越界,没有语法错误(不能检查,也不想检查)。
- 数组越界使用时访问的是它之后的内存(可能是其它变量,也可能是其它数组,也有可能无主的,也有可能属于操作系统)。
- 数组越界的后果:
1、产生脏数据。
2、一切正常。
3、段错误 (核心已转储)。
二维数组
-
二维数组:把变量排一个方阵
-
定义:类型 数组名[行数][列数];
int arr[3][4]; [][][][] [][][][] [][][][]
-
使用:数组名[行编号][列编号],编号从零开始。
arr[0][0],arr[0][1],arr[0][2],arr[0][3] arr[1][0],arr[1][1],arr[1][2],arr[1][3] arr[2][0],arr[2][1],arr[2][2],arr[2][3]
-
遍历:配合双层for,外层循环负责遍历行,内层循环负责遍历列。
#include <stdio.h> int main() { int arr[3][4]; for(int i=0; i<3; i++) { for(int j=0; j<4; j++) { printf("%d ",arr[i][j]); } printf("\n"); } }
-
初始化:数组名[行编号][列编号] = {{v0,v1,v2},{v0,v1,v2},{v0,v1,v2}};
变长数组
变长数组:数组的长度在编译时可以先不确定,在运行期间根据实际情况进行计算,当执行到数组定义语句时,就必须确定下来,再能再改变。
-
优点:可根据实际情况确定数组的长度,达到节约内存的目的。
-
缺点:不能初始化。
#include <stdio.h> int main() { int len = 0; printf("请输入数组的长度:"); scanf("%d",&len); int arr[len]; printf("len=%d,数组的长度:%d\n",len,sizeof(arr)/sizeof(arr[0])); }
函数
函数是C语言中管理代码的最小单位(把若干行代码集合在一起形成一个整体),一个函数就相当于一段具有某项功能的代码。
函数的分类:
-
标准库函数:C语言标准委员会为C语言提供了一些基本功能,把这些基础功能分别封装成函数,包装成一个库(libc.so);
-
输入输出:scanf/printf/getchar/putchar/gets/puts
-
字符串:strlen/strcat/strcpy/strcmp/strstr
-
数学:sqrt/pow
注意:编译时需要 参数-lm
-
时间:time.h
time(NULL) 获取到自1970年1月1日00:00::00到现在一共过了多少秒。
-
内存:malloc/free
-
other:
stdlib.h
rand/srand/system伪随机:把所有符号整数打乱顺序存储到计算机中,rand可以获取到一个无符号整数,rand默认从第一个位置获取。 srand设置获取随机数的位置。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); for(int i=0; i<10; i++) { int num = rand()%900+100; printf("%d\n",num); } }
-
系统函数:操作系统提供的一些功能,以函数形式使用(但不是函数),系统API。
-
第三方库函数:
JSON
MD5
XML
openCV
openGL
Qt/MFC