复习:
1、C代码变成可执行程序的过程
预处理:查看宏函数的替换结果,检查宏函数
gcc -E
编译:理解C代码的底层原理,函数重载
gcc -S
汇编:生成代码库,静态库、共享库
gcc -c
链接:是多文件编程的基础
gcc a.o b.o c.o ...
2、gcc编译器常用参数:
-E -S -c -std=gnu99 -o -I -l -Wall -Werror -D(命令行定义宏)
3、C语言文件类型
.h .h.gch .c .i .s .o .a .so
4、数据类型
signed char 1 %hhd -128~127
signed short 2 %hd -32768~32767
signed int 4 %d 正负20亿
signed long 4/8 %ld
signed long long 8 %lld 正负9开头的19位整数
unsigned char 1 %hhu 0~255
unsigned short 2 %hu 0~65535
unsigned int 4 %u 0~40亿
unsigned long 4/8 %lu
unsigned long long 8 %llu 0~1开头的20位整数
float 4 %f
double 8 %lf
long double 12/16 %LF
小数点后6位有效
问:有float x,如何判断x与零值是否相等
if(x < 0.000001 && x > -0.000001)
5、C变量名取名规则
1、必须由字母、数字、下划线组成
2、必须由字母或下划线开头
3、不能与32个关键词重名
4、见名知意
6、变量输入输出
printf 提示信息+占位符+变量名列表
scanf 占位符+变量地址列表
%nd %-nd %0nd %n.mf %g
7、运算符
/ % 除数不能为0 报错:浮点数例外(核心已转储)
== 变量尽量在右边
++/-- 尽量不要在一行内多次使用
&& || 具有短路特性
注意:运算符也是有优先级
8、类型转换
自动类型转换:不同类型的数据之间需要先转换为相同的类型数据才能进行运算
1、字节少的向字节多的转
2、有符号的向无符号的转(字节数相同的情况下)
3、整型向浮点型转
注意:以不丢失数据为基础,适当地牺牲空间
强制类型转换:
(新类型)数据
注意:有丢失数据的风险,谨慎使用
---------------------------------------
跳转语句
goto 可以在函数内任意跳转
它可能会破坏已经设计好的分支、循环语句,因此绝大多数公司禁止使用
但是它在驱动编程时特别适合处理异常
标签名: ...
goto 标签名;
练习1:要求不适用循环语句来计算N的阶乘
//1
int N,i = 1,sum = 1;
printf("请输入N的值:");
scanf("%d",&N);
loop:
if(i <= N)
{
sum = sum * i;
i++;
goto loop;
}
printf("%d",sum);
return 0;
//2
int N = 0,sum = 1;
printf("请输入N的值:");
scanf("%d",&N);
loop:
num *= N;
if(--N > 1) goto loop;
printf("ret=%d\n",ret);
break
1、配合switch使用,关闭执行开关
2、调出当前次循环,只能跳一层
continue
结束本次循环,直接进入下一次循环
return
1、返回一个数据给函数的调用者
2、立即结束函数的执行
练习2:不适用循环语句计算前N项斐波那契数列
数组:
什么是数组:变量的组合,是一种批量定义变量的方式
定义:类型 数组名[数量];
int arr[5]
使用:数组名[下标];
下标:从零开始 范围:0~数量-1
初始化:类型 数组名[数量] = (1,2,3,4 ...)
1、数组与普通变量一样默认是随机的,为了安全对数组进行初始化
2、这种初始化语法只能在定义数组时使用,并且只能逐个赋值,不能整体赋值
3、初始化数据过多,编译器会产生警告并丢弃
4、初始化数据不足,编译器会自动补0
5、初始化的数据可以省略,只写大括号,相当于给所有成员赋0
6、初始化数据时,长度可以省略,编译器会自动统计数据的个数然后告诉数组
数组的长度 = sizeof(arr)/sizeof(arr arr())
练习3:定义一个长度为10的数组并初始化,计算出该数组的最大值、最小值、平均值
// #include <stdio.h>
int main(int argc,const char* argv[])
{
int arr[10] = {1,4,7,9,3,4,6,19,3,4};
int max = arr[0],min = arr[0],sum = arr[0];
float avg = 0;
for(int i = 1; i<10; i++)
{
if(arr[i] > max)
{
max = arr[i];
}
if(arr[i] < min)
{
min = arr[i];
}
sum += arr[i];
avg = sum/10;
}
printf("max=%d min=%d avg=%lf\n",max,min,avg);
}
练习4:定义一个长度为10的数组并初始化,进行升序排列
// #include <stdio.h>
int main(int argc,const char* argv[])
{
int temp,arr[10] = {1,4,2,5,6,7,8,9,12,13};
for(int i=0; i<9; i++)
{
for(int j = i+1; j<10; j++)
{
if(arr[i] > arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for(int i = 0; i<10; i++)
{
printf("%d",arr[i]);
}
}
数组越界:为了程序的运行效率是不会检查数组的下标
数组越界的后果:
1、一切正常
2、段错误
3、脏数据
练习5:定义一个长度为10的数组并初始化,找出数组中第二大的值(不允许排序)
// #include <stdio.h>
int main(int argc,const char* argv[])
{
int arr[10] = {3,5,67,3,2,6,7,10,4,2};
int max = arr[0] > arr[1]?arr[0]:arr[1];
int max2 = arr[0] > arr[1]?arr[1]:arr[0];
for(int i = 2; i<10; i++)
{
if(arr[i] > max)
{
max2 = max;
max = arr[i];
}
else if(arr[i] >= max2)
{
max2 = arr[i];
}
}
printf("%d %d\n",max,max2);
}
作业:
1、打印9*9乘法表
2、编程解决百钱百鸡问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
3、计算出100~10000之间的所有素数
4、输入一个日期(yyyy-mm-dd),计算该日期距离公元1年1月1日多了多少天? time(NULL)
5、显示以下图形(printf一次只能输出一个字符)
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********