#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;
}