函数
程序语句可以分组,分组可以一层又一层的进行下去,顶级分组就是函数。函数实现了对程序语句的分组。不同的函数通过函数名区分,函数名有"两个代表",一是代表整个函数所在代码区,二是代表函数所在代码区里的首条语句首地址。
函数分为函数头和函数体,函数头单独出现叫做函数声明。
函数中的return;语句主要功能在于立即结束函数的执行,她的附带作用是想主调函数传送一个返回值。也就是说,函数在执行过程中将会在遇到return语句或者遇到函数右大括号时候立即结束函数执行。需要注意的是,当由return语句传送一个返回值时候必须在函数头中指明返回值类型。
注意: return;//立即停止执行当前函数执行,返回主调函数。
exit(0);//功能执行比return更强硬,exit();语句立即终止程序执行,将参数返回给操作系统,相当于位于main函数的return语句。exit()函数在头文件stdllib.h里面。
主调函数的函数调用语句的函数参数称为"实际参数",简称"实参";被调函数函数定义时定义的参数变量称为"形式参数",简称"形参"。C语言实参向形参只进行"值传递"。
C语言源程序中函数的声明应避免依赖编译器的隐式声明。我们应该在源程序的开头把文件中所有函数的声明都列出来。否则有可能在编译时候导致编译器进行隐式声明,这种声明方式可能引起问题,我们应该在源程序中避免编译器的隐式声明。
程序语句可以分组,分组可以一层又一层的进行下去,顶级分组就是函数。函数实现了对程序语句的分组。不同的函数通过函数名区分,函数名有"两个代表",一是代表整个函数所在代码区,二是代表函数所在代码区里的首条语句首地址。
函数分为函数头和函数体,函数头单独出现叫做函数声明。
函数中的return;语句主要功能在于立即结束函数的执行,她的附带作用是想主调函数传送一个返回值。也就是说,函数在执行过程中将会在遇到return语句或者遇到函数右大括号时候立即结束函数执行。需要注意的是,当由return语句传送一个返回值时候必须在函数头中指明返回值类型。
注意: return;//立即停止执行当前函数执行,返回主调函数。
exit(0);//功能执行比return更强硬,exit();语句立即终止程序执行,将参数返回给操作系统,相当于位于main函数的return语句。exit()函数在头文件stdllib.h里面。
主调函数的函数调用语句的函数参数称为"实际参数",简称"实参";被调函数函数定义时定义的参数变量称为"形式参数",简称"形参"。C语言实参向形参只进行"值传递"。
C语言源程序中函数的声明应避免依赖编译器的隐式声明。我们应该在源程序的开头把文件中所有函数的声明都列出来。否则有可能在编译时候导致编译器进行隐式声明,这种声明方式可能引起问题,我们应该在源程序中避免编译器的隐式声明。
/*
* 函数练习 - 隐式函数声明
*
* 以下源程序是可以编译通过的,因为gcc聪明了,当她编译到语句value = add(2, 3)时,自行假定了add函数声明是int add();这叫做"隐式声明"。
*
* 正因存在隐式声明int add();所以编译就通过了。但是,若实际的add函数是void add();那么gcc的假定就是错误的,所以编译会报错
C语言源程序中函数的声明应避免依赖编译器的隐式声明。我们应该在源程序的开头把文件中所有函数的声明都列出来。否则有可能在编译时候导致编译器进行隐式声明,这种声明方式可能引起问题,我们应该在源程序中避免编译器的隐式声明。
* */
#include <stdio.h>
void show(int value)
{//output
printf("计算结果是");
printf("%d\n", value);
return ;
}
int main()
{
int value = 0;
value = add(2, 3);
show(value);
return 0;
}
int add(int value1, int value2)
{//add
return value1 + value2;
}
/*
* 函数练习
* 编辑read函数和show函数,show从键盘读入一个整数,由show函数输出
* */
#include <stdio.h>
int read();
void show(int);//该语句书写为void show();编译也可以通过,函数声明语句可以供编译器编译本源程序时候使用
int main()
{
int value = 0;
value = read();
show(value);
return 0;
}
int read()
{
int value;
printf("请输入一个整数:");
while (!scanf("%d", &value)){
scanf("%*[^\n]");
scanf("%*c");
printf("程序未能从输入流中提取到整数,请再次输入一个整数:");
}
scanf("%*[^\n]");
scanf("%*c");
return value;
}
void show(int value)
{
//fflush(stdout)可以把输出缓冲区中的所有内容立刻显示在屏幕上
printf("%d\n", value);
return ;
}
/*
* 汉诺塔问题
* */
#include <stdio.h>
unsigned han_nuo_ta(int value, char a, char b, char c);
main()
{
int value = 0;
char a = 'A', b = 'B', c = 'C';
scanf("%d", &value);
han_nuo_ta(value, a, b, c);
}
unsigned han_nuo_ta(int value, char a, char b, char c)
{
static unsigned counter = 0;
if (value != 1) {
han_nuo_ta(value - 1, a, c, b);
printf("第%d步:%d盘子%c -> %c\n", ++counter, value, a, c);
han_nuo_ta(value - 1, b, a, c);
return counter;
}
else
{
printf("第%d步:%d盘子%c -> %c\n", ++counter, value, a, c);
return counter;
}
}
/*
* 函数练习
* */
#include <stdio.h>
void func()
{
printf("abc\n");
//return;//立即停止执行当前函数执行,返回主调函数。
//exit(0);//功能执行比return更强硬,exit();语句立即终止程序执行,将参数返回给操作系统,相当于位于main函数的return语句。exit()函数在头文件stdllib.h里面。
printf("def\n");
return ;
}
int main()
{
func();
printf("xyz\n");
return 0;
}