函数三要素:返回值、参数列表、声明
1函数的定义
main函数作为整个程序的入口,返回值给了他的父进程
char argv[]指针数组:[]优先级很高,argv[]代表数组,里面所有的元素是char类型,每个main函数的参数都是字符串(char )
直接给main函数传参,一空格表示一个参数的结束
strcmp比较两个字符串大小strcmp(const char s1, const char *s2)
形式、
//函数实现(定义)
float add(float a, float b)
{
float c = a + b;
return c;
// return a + b;
}
float sub(float a, float b)
{
return a - b;
}
float mul(float a, float b)
{
return a * b;
}
float div(float a, float b)
{
if (b == 0)
{
printf("除数不能是0.\n");
//高精度向低精度隐式转换,会丢掉数据。低精度向高精度隐式转换,结果更精确。
// return -1;
// 结束整个程序
_exit(0);
}
return a / b;
}
2函数的声明
形式
#include <stdio.h>
#include <unistd.h>
//函数的声明
float add(float a, float b);
float sub(float a, float b);
float mul(float a, float b);
float div(float a, float b);
3函数的调用
形式 switch (ch)
{
case '+':
ret = add(a, b);
break;
case '-':
ret = sub(a, b);
break;
case '*':
ret = mul(a, b);
break;
case '/':
ret = div(a, b);
break;
default:
printf("error.\n");
break;
}
注意 一般使用函数两种顺序
【1 函数声明 调用 定义 2 定义 调用】
宏
不带参数的宏定义:
#define 宏名 字符序列
#define FALSE 0
带参数的宏定义:
#define 宏名(形参表) 字符序列
#define MAX(a,b) ( (a) > (b) ) ? (a) : (b)
取消宏定义:
#undef 宏名
带参宏和内联函数
一些语句比较短小,功能比较简单的函数,可以用宏定义实现,提高效率。
宏定义只是替换,没有调用开销(栈空间的使用),函数有开销。
函数会检查你的参数列表和返回值类型,而宏定义没有类型,也就不会检查
带参宏和普通函数
1、能完成相类似的功能
2、函数会检查你的参数列表和返回值类型,而宏定义没有类型,也就谈不上检查
3、宏定义只是替换,没有调用开销,函数有开销。
/ 高仿shell
#include <stdio.h>
#include <string.h>
//定义一些我们自己的命令
#define ls_ "ls123"
#define pwd "pwd123"
#define mkdir "mkdir_123"
//自定义命令个数
#define NUM 3
//每个命令支持最大字符个数
#define CNT 100
//全局变量,3行100字符的数组, 默认是全为0
char buf[NUM][CNT];
//进行命令初始化
void initcommand(void)
{
strcpy(buf[0], ls);
strcpy(buf[1], pwd);
strcpy(buf[2], mkdir);
}
int main(void)
{
//定义一个输入命令的字符数组
char cmd[CNT];
memset(cmd, 0, sizeof(cmd));
//初始化命令
init_command();
//工作
while (1)
{
printf("[root@]# ");
//输入命令
scanf("%s", cmd);
//查找命令
int i = 0;
for (i=0; i<NUM; i++)
{
if (!strcmp(buf[i], cmd))
{
printf("%s是合法命令:%s.\n", cmd, buf[i]);
break;
}
}
if (i >= 3)
{
printf("%s是非法命令,请重新输入.\n", cmd);
}
}
return 0;
}
行缓冲
输出行缓冲:
以\n为输出结束标识符,若没有该换行符,则将一直运算至缓冲区填满后或运算结束后一起输出。
输入行缓冲:
以\n为输入结束标识符,若不键入换行符,则一直等待输入。
精度转换
默认低精度向高精度转换
高精度向低精度转换会丢失数据
0代表数字零
'/0'代表字符串的结束
'0'代表字符0
strcmp strcpy strcat
a,b两组字符串
strcmp ( a , b ) 将两个字符串进行对比,相等返回值为0,a大于b返回值正数,a小于b返回值为负
strcpy ( a , b ) 将字符串b复制到字符串a上
strcat ( a , b ) 将字符串b追加在字符串a后面
递归函数的应用
1阶乘
2fibo
迭代函数的应用
求10 之内的和
转载于:https://blog.51cto.com/13408467/2043906