文章标题

来源:互联网 发布:win7端口查看 编辑:程序博客网 时间:2024/05/24 01:10

函数

首先,什么是函数?函数是完成特定任务的独立程序代码单元。语法规则定义了函数的结构和使用方式。虽然C中的函数和其他语言中的函数、子程序、过程作用相同,但是细节上略有不同。一些函数执行某些动作,如printf()把数据打印到屏幕上;一些函数找出一些值供程序使用,如strlen()把指定字符串的长度返回给程序。一般而言,函数可以同时具备以上两种功能。
  1. 函数的三要素:返回值、参数列表、声明。
 * */#include <stdio.h>#include <string.h>//main函数作为整个程序的入口,返回值给了他的父进程//char *argv[]指针数组:[]优先级很高,argv[]代表数组,里面所有的元素是char*类型,每个main函数的参数都是字符串(char *)//直接给main函数传参,一空格表示一个参数的结束int main(int argc, char *argv[]){    //strcmp比较两个字符串大小strcmp(const char *s1, const char *s2)    int ret = strcmp("08", "123467");    printf("ret = %d.\n", ret);    ret = strcmp("923456", "123467");    printf("ret = %d.\n", ret);    char *p = "中国";    printf("%s.\n", p);    char str[] = "123";    char *p_str = "123";    char *p_str1 = "123";    if (p_str == p_str1)        printf("==.\n");    if (str == p_str)        printf("ok.\n");/*    //终端输入1:打印出男孩,输入2:打印女孩    if (2 != argc)    {        printf("参数错误.\n");        return -1;    }    if (!strcmp(argv[1],"1") // strcmp(argv[1], "1") == 0    {        printf("男孩.\n");    }    else if(!strcmp(argv[1],"2"))    {        printf("女孩.\n");            }*//*      char buf[100] = {0};    printf("终端输入:\n");    scanf("%s", buf);    //main函数的参数,argc代表main函数参数个数    printf("main函数个数:%d.\n", argc);     //打印出main函数的参数    int i = 0;    for (i=0; i<argc; i++)    {        printf("argv[%d] = %s\n", i, argv[i]);    }   */    return 0;}
  1. 递归函数
* */#include <stdio.h>//计算阶乘(递归)int jiecheng(int a){    if (a <= 0)    {        printf("参数错误.\n");        return -1;    }    //回归条件    if (a == 1)    {        return 1;    }    return a * jiecheng(a-1);}//递归解决求fibo数列某一项的值: 1 1 2 3 5 8 13 21 34 55int fibo(int num){    if (num > 0)    {        if (1 == num)        {            return 1;        }        if (2 == num)        {            return 1;        }        return fibo(num-1) + fibo(num-2);    }}int main(void){//  int arr[10000000000000000000000];//  int ret = jiecheng(-1);//  printf("ret = %d.\n", ret);    int a = 0;    while (1)    {        printf("输入0表示推出.\n");        scanf("%d", &a);        if (0 == a)        {            break;        }        printf("%d项的fibo值:%d.\n", a, fibo(a));    }    return 0;}
  1. 迭代函数
/#include <stdio.h>//计算从1开始到某个数据内所有的和int sum(int a){    int i = 1, sum = 0;    if (a > 0)    {        for (i=1; i<=a; i++)        {            //迭加            //i值每变化一次就更新sum值            sum += i;        }    }    //最终的结果,中间环节不需要    return sum;}int main(void){    int a = 100;    printf("%d内的和:%d.\n", a, sum(a));    int i = 1, sum;    for (i=1; i<10; i++)    {//      printf("sum = %d.\n", sum+=i);        printf("sum = %d", sum+=i);        sleep(1);    }    return 0;}
  1. 函数的声明
#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);int main(void){    //用标准输入scanf    printf("从键盘输入两个数,以回车结束:\n");    float a, b, ret;    //默认是行缓冲。留在了你的输入的缓冲区,留下了一个'\n'    scanf("%f %f", &a, &b);    char ch = 0;    printf("从键盘输入你要计算的运算符:+ - * /:\n");/*  scanf("%c", &ch);    //ch = 10.对应‘\n’的asc码值:    printf("ch = %d.\n", ch);*/    do     {        scanf("%c", &ch);    }while (ch == '\n');    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;    }    printf("%.2f %c %.2f = %.2f.\n", a, ch, b, ret);/*    //调用函数    float ret = add(a, b);    //float类型默认精度小数点后6位    printf("ret = %.2f.\n", ret);*/    return 0;}//函数实现(定义)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;}
  1. void
/* *  void表示类型的一个关键字,空类型(暂时我们不知道该给他什么类型) *  void类型占1个字节,但是需要特定类型时,可以进行强制类型转换 * * */#include <stdio.h>void func1(void){    printf("hello, world.\n");}//a就是子函数的形参,相当于子函数里的局部变量,函数结束,也就销毁了。int func2(int a){       printf("a = %d.\n", a);    a = 23;}//交换a、b的值void func3(int a, int b){    int temp = 0;    temp = a;    a = b;    b = temp;}int main(void){    int x = 3, y = 4;    //分析:1、在子函数里是实参x值(3)、y值(4),进入子函数,分别赋值给了a、b。    //子函数里,是发生了变化,但是main函数里的实参一点也没变    func3(x, y);    printf("x = %d, y = %d.\n", x, y);/*    //函数调用    func1();    int val = 2;    //传值调用:1、val变量里面的值(2),进入了子函数里,并赋值给了a,所以val本身(真身)没有进去子函数    func2(val);    printf("val = %d.\n", val);*//*    //不允许定义此类型变量//  void a = 1;    //error: variable or field ‘a’ declared void//  int b = (int)a;//  printf("b = %d.\n", b);    printf("sizeof(void) = %d.\n", sizeof(void));*/      return 0;}
  1. 带参宏和普通函数
 *  1、能完成相类似的功能 *  2、函数会检查你的参数列表和返回值类型,而宏定义没有类型,也就谈不上检查 *  3、宏定义只是替换,没有调用开销,函数有开销。 * *  你的函数短小,但是还想利用检查参数的机制,要提高我的效率? *  内联函数,处理这些问题.调用开销 * * */#include <stdio.h>#define MAX 5#define S(x) ((x)*(x))#define MIN(a, b) (((a)<(b)) ? (a) : (b))#define STR "123456789"//函数会检查你的参数类型int func_min(int a, int b){    return (a < b ? a : b);/*    if (a > b)    {        return b;    }    else    {        return a;    }*/}//内联函数inline void func1(void){    printf("hello.\n");}int main(void){/*    unsigned  a = -1;    float b = 0.1;    printf("数据:%f.\n", a);    printf("数据:%f", a + b);     printf("数据:%u.\n", a + b);*//*    func1();    float f1 = 3.14;    float f2 = 3.15;    int ret = func_min('A', f2);    printf("ret = %d.\n", ret);    func_min(3.14, 3.15);*//*    int ret = S(3);    printf("ret = %d.\n", ret);    ret  = S(3+1);    printf("ret = %d.\n", ret);    float ret1 = MIN(3.14, 3.15);    ret = MIN(3, 4);    char *p = STR;    printf("字符串:%s.\n", STR);*/    return 0;}
  1. 数学库
链接的时候需要-lm * */#include <stdio.h>#include <math.h>int main(void){    double ret = sqrt(16);    printf("ret = %.2f.\n", ret);    char *p1;    short *p2;    double *p3;    printf("sizeof(p1) = %d.\n", sizeof(p1));    printf("p1 = %p.\n", p1);       return 0;}