一、循环:break / continue / goto
- break:跳出整个循环,循环直接结束
- continue:仅跳过本次循环剩下代码,直接进入下一轮循环
goto语法
作用:函数内部跳转;多用于错误处理、跳出多层循环
不推荐滥用goto,会打乱代码阅读逻辑
#include <stdio.h>
int main()
{
printf(“A\n”);
goto next; // 直接跳到next标签,中间printf不会执行
printf(“B\n”);
next:
printf(“C\n”);
return 0;
}
格式:
goto next ;
next:
二、随机数 rand & srand & time
头文件
- rand() 、 srand() → #include <stdlib.h>
- time() → #include <time.h>
- rand() :生成随机整数,种子不变,每次运行出来的随机数序列一模一样,可以预测
printf(“%d\n”, rand());
- 种子:rand生成随机数的基准数值。种子固定,随机序列固定。
- srand(种子) :设置随机数种子。
- time(NULL) :返回系统当前时间差值(时间一直在变化),拿来做种子,实现真随机。
标准写法:
srand((unsigned int)time(NULL));
- time(NULL) :拿到时间数值
- (unsigned int) :强制类型转换,匹配srand参数类型
随机数范围公式
通用公式: a + rand() % (b‑a + 1) 生成 [a , b] 的整数
- 0~99: rand() % 100;
- 1~100: rand() % 100 + 1;
- 100~200: 100 + rand() % (200‑100 + 1);
注意: srand() 整个程序只调用一次,不要写在循环内部。放在头文件下面
三、数组
数组:一组相同数据类型元素的集合。分为一维数组、多维(二维)数组。
定义格式
类型 数组名[元素个数];
//示例:存放20个人数学成绩
int math[20];
类型可以: char short int float
数组初始化
- 完全初始化
int arr[2] = {1,2};
- 不完全初始化
int arr[6] = {1};
只给第一个元素赋值,剩下全部自动补0
字符数组 vs 字符串
- 字符串:末尾自带隐藏结束符 \0
char arr[] = “abc”; // 自动末尾补’\0’
- 普通字符数组:没有 \0 ,不能直接当字符串打印
char arr[3] = {‘1’,‘2’,‘3’};
重点:用 %s 打印,必须保证内存后面存在 \0 ,否则乱码。
3.szeaof 和strlen的区别
sizeof
- 运算符(操作符),算整个数组占内存总字节数
- int arr[5] : sizeof(arr) = 5*4=20字节
- 数组传参变成指针之后,sizeof就得不到数组真实大小(这个求的是内存的大小,不管内存里面放了什么东西)
在循环中:经常见到
sz=szeaof(arr[5])/szeaof(arr[0]);
strlen
- 库函数, <string.h> ,只针对字符串
- 统计 ‘\0’ 之前有效字符个数,不包含结束符 \0
- 普通char数组没有 \0 绝对不能用strlen,结果乱码随机值
这个要头函数 #include<string.h>;
数组的[]
- 定义:int arr[10];
[10] = 数组元素总容量,一共10个元素,下标0‑9 - 访问:arr[3] = 10;
[3] = 下标索引,取第4个元素
陷阱:定义写10,最大合法下标是9,arr[10]越界
下标是从0开始的
数组初始化小要点
int arr[5]={1,2};
不完全初始化,剩下元素自动赋值0;
char字符串数组 char str[]=“abc” ,编译器自动补 \0 ;
如果是 char str[]={‘a’,‘b’,‘c’} ,不会自带 \0 。
易错点汇总
- break 结束整个循环; continue 只跳过这一轮。
- goto只能在同一个函数内部跳转,不能跨函数。
- rand不写srand,每次运行随机数完全一样。
- srand((unsigned int)time(NULL)); 只写一次,放main开头。
- 数组不完全初始化,未赋值元素默认是0。
- 字符串自带 \0 ;普通字符数组不会自动加 \0 。