黑马程序员_iOS开发C语言基础之函数

来源:互联网 发布:怎么转让淘宝店铺 编辑:程序博客网 时间:2024/05/05 09:09
函数
1、函数内存示意图:

#include<stdio.h>


int sum(int num1 , int num2)

{

    return num1+num2;

}


int main()

{

    int a = 100;

    int b =27;

    int c = sum(a , b);

    return 0;

}


子函数sum调用完后,sum函数中定义的变量全部收回


2、函数体内部不能定义和形参一样的变量,基本类型作为函数形参,纯粹是值传递

3、return的作用,退出函数,返回一个具体值给函数调用者。

   返回值类型为void时,也可以用   return;  \\ 表示退出函数,但没有返回值

   返回值类型不为void时,return 变量; //返回变量值,要和返回值类型匹配

4、C语言是弱语法,弱类型,默认返回类型为int,如果有返回值类型,但函数没有return语句,没有返回任何值,也可以调用,只会产生警告。

5、但不允许两个函数的名称一样,函数不能嵌套定义的。

6、函数声明,在main函数前面声明,声明只在编译阶段有用。函数不能重复定义,但可以重复声明,也可以在main函数内声明,只要在函数调用前声明就好。示例代码如下:

#include <stdio.h>


// 函数声明可以在main函数外

void printLine();


int main()

{

    // 函数声明也可以在main函数内,只要在调用函数前声明就好

    void printLine();

    printLine();

    return 0;

}


void printLine()

{

    printf("--------\n");

}


7、编译器只检测语法,比如把函数定义注释后,编译也是可以通过的,链接时报错,因为链接的时候会检测被调用的函数定义是否存在,示例代码如下

#include <stdio.h>

void printLine();

int main()

{

    void printLine();

    printLine();

    return 0;

}

/*

void printLine()

{

    printf("--------\n");

}

*/


8、include的作用如下:


/*

 include

 1> 作用:拷贝右边文件的所用内容到#include所在的位置

 2> 自定义的文件用"",系统自带的文件用<>

 */

#include <stdio.h>


int main()

{

    //printf("哈哈哈\n");

    //#include "haha/haha.txt";

    #include "/Users/Tan/Desktop/C_exercise/0927/haha/haha.txt"

    return 0;

}


9、如果当前函数没有定义test();但是可以通过编译,只是会用警告,但是链接不会通过,因为链接会检测被调用的函数定义是否存在,但如果有test()定义但是调用前没有声明,就会通不过编译,编译语法通不过。如果把//#include <stdio.h>这个头文件屏蔽了,在编译的时候,对printf()函数也是只有警告,在链接时把函数库中printf的函数定义合并在一起,就可以链接成功,生成可执行a.out文件。#include<stdio.h>只是对printf函数声明。所以编译时有函数声明,链接时有函数定义,就不会有警告和错误。


3> #include<stdio.h>的目的:拷贝printf函数的声明。链接时把C自定义函数库中printf的函数定义合并在一起

 */

//#include <stdio.h>

int main()

{

   test();

    printf("哈哈哈\n");

    //#include "haha/haha.txt";

    //#include "/Users/Tan/Desktop/C_exercise/0927/haha/haha.txt"

    return 0;

}

/*void test()

{

    ;

}*/


10、项目多文件编译链接操作

/*

 张三

    编写main函数

 编译张三.c产生张三.o,这个张三.o文件里只有main函数定义,没有average()函数定义,链接的时候出错。

 

所以 CC 李四.o 张三.o  就是把这两个目标文件链接生成一个可执行文件 ,成功生成a.out文件。实现张三文件调用李四。

 张三.c文件单独编译成功,李四.c文件单独编译成功,都生成目标.o文件,然后再一起链接成功,因为单独链接不能成功。

 

 链接:把项目中所有相关联的.o目标文件、C语言函数库合并在一起,生成可执行文件 

 */

#include <stdio.h>


int main()

{

    int score1 = 100;

    int score2 = 70;

    

    int c = average(score1, score2);

    printf("%d\n", c);

    return 0;

}


/*

 李四

    编写基本算术运算的函数

 

 编译李四.c文件能通过,因为编译只检测语法,结果是没有警告也没用错误。但是链接不能成功,因为这个李四.o文件只有average();没有main(),链接成功就是生成可执行函数,但是没有main函数,怎么能生成可执行文件呢。

 */


int average(int a, int b)

{

    return (a+b)/2;

}


10、初步优化 


优化:

 简洁的指令: cc 张三.c 李四.c  直接生成a.out可执行文件

 调用函数之前声明,int average(int a, int b);

 int sum(int a, int b);去除编译时的警告,否则会提示implicit declaration 意思是没有明确的声明。

 */

#include <stdio.h>


int average(int a, int b);

int sum(int a, int b);

int main()

{

    int score1 = 100;

    int score2 = 70;

    

    int c = average(score1, score2);

    int d = sum(score1, score2);

    printf("平均分是%d\n", c);

    printf("总分是%d\n", d);

    return 0;

}

/*

 李四

    编写基本算术运算的函数

 

 编译李四.c文件能通过,因为编译只检测语法,结果是没有警告也没用错误。但是链接不能成功,因为这个李四.o文件只有average();没有main(),链接成功就是生成可执行函数,但是没有main函数,怎么能生成可执行文件呢。

 */


int average(int a, int b)

{

    return (a+b)/2;

}

int sum(int a, int b)

{

    return a+b;

}


11、优化2


优化2

 每次调用李四的新增的函数,都有从李四.c文件中找到并拷贝,太麻烦,所以写一个李四.h文件,交给李四写,因为李四最清楚函数的声明。只有李四新增或改变功能,只要加载李四.h的头文件就行了,不用一一拷贝了

 1.函数的定义放.c 文件,函数的声明放.h文件

 2.如果要使用某个.c文件中定义的函数,只需要#include这个.c文件对应的.h文件。

 3..h文件的作用:被别人拷贝,编译链接的时候不需要管.h文件

    命令:cc 张三.c 李四.c 就行了,这个.h文件不用搞进来,因为.h文件不是源代码文件。

 */

#include <stdio.h>

#include "李四.h"

//int average(int a, int b);

//int sum(int a, int b);

int main()

{

    int score1 = 100;

    int score2 = 70;

    

    int c = average(score1, score2);

    int d = sum(score1, score2);

    printf("平均分是%d\n", c);

    printf("总分是%d\n", d);

    return 0;

}

********************************************

/*

 李四

    编写基本算术运算的函数

 

 编译李四.c文件能通过,因为编译只检测语法,结果是没有警告也没用错误。但是链接不能成功,因为这个李四.o文件只有average();没有main(),链接成功就是生成可执行函数,但是没有main函数,怎么能生成可执行文件呢。

 */


int average(int a, int b)

{

    return (a+b)/2;

}

int sum(int a, int b)

{

    return a+b;

}

int minus(int a, int b)

{

    return a - b ;

}

*******************************************

/*

 李四

    编写函数的声明

 */


int average(int a, int b);

int sum(int a, int b);


11、main函数返回值作用和printf()返回值

    // printf();函数是有返回值的,表示字符串字符长度

    // \" 表示“””

    // 一个中文占据了3个字符    

    int e = printf("aaa");// e=3

    printf("e=%d\n",e);

    // main函数返回值,是返回操作系统,操作系统根据返回值,标记程序是怎么退出程序函数,返回0告诉系统正常退出,返回其他值表示不是正常退出。

    return 0;

}


0 0
原创粉丝点击