目录
一、关于数组
C99标准之前:
数组的大小只能是常量来指定如:
int arr[10]; 或 int arr[5 + 5];
C99标准之中:
引入了一个:变长数组的概念,变长数组允许数组的大小使用变量来指定。
int n = 10;
int arr[n]; 同时c99也支持int arr[10]; 或 int arr[5 + 5];
这里变长数组并不是意味着,数组大小能改变,一旦创建数组大小还是不能改变的。只是说数组的大小是通过变量来指定的。
还有一个注意⚠️事项
int arr[n]; 不能初始化
二、static
static修饰的变量不能被改变,说法是错误的。只有const常属性才不会被修改。
static修饰变量
static修饰函数中局部变量:
声明周期延长:该变量不随函数结束而结束
初始化:只在第一次调用该函数时进行初始化
记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
存储位置:不会存储在栈上,放在数据段
static修饰全局变量
改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用
修饰变量时,没有被初始化时会被自动初始化为0
static修饰函数
改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用
三、关键字
typedef 是关键字
#define
同#include 都是预处理指令
四、switch
switch语句中表达式的类型只能是:整形和枚举类型,切记不能为浮点型
五、练习题
1.写一个代码:打印100~200之间的素数
#include <stdio.h>
//素数的判断:
//只能被1和它本身整除的数,是素数
// 如:7
int main()
{
int i = 0;
for (i=100;i<=200;i++)
{
//判断i是否为素数
//拿2~i-1之间的数字去试除i
int flag=1;
int j = 0;
for (j =2;j<i;j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1)
{
printf("%d ", i);
}
}
return 0;
}
优化:
思想->如果在以内能找到不到因子,就一定是素数了
#include <stdio.h>
#include <math.h>
//素数的判断:
//只能被1和它本身整除的数,是素数
// 如:7
int main()
{
int i = 0;
for (i=100;i<=200;i++)
{
//判断i是否为素数
//拿2~i-1之间的数字去试除i
int flag=1;
int j = 0;
for (j =2;j<=sqrt(i);j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1)
{
printf("%d ", i);
}
}
return 0;
}
继续优化:
素数不可能是偶数所以
#include <stdio.h>
#include <math.h>
//素数的判断:
//只能被1和它本身整除的数,是素数
// 如:7
int main()
{
int i = 0;
for (i=101;i<=200;i+=2)
{
//判断i是否为素数
//拿2~i-1之间的数字去试除i
int flag=1;
int j = 0;
for (j =2;j<=sqrt(i);j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1)
{
printf("%d ", i);
}
}
return 0;
}
参考《素数求解的N种境界》,可以引发大家的思考。
2.给定两个数,求这两个数的最大公约数
例如:
输入:20 40
输出:20
普通解法:
#include <stdio.h>
int main()
{
int m=0,n=0;
scanf("%d %d",&m,&n);
int k=(m < n ? m : n);
while (1)
{
if(m % k == 0 && n % k == 0)
{
break;
}
k--;
}
printf("%d\n",k);
return 0;
}
辗转相除法:
#include <stdio.h>
int main()
{
int m=0,n=0;
scanf("%d %d",&m,&n);
int k=0;
while (k = m % n)
{
m = n;
n = k;
}
printf("%d\n",n);
return 0;
}