函数结构
/*
*函数说明
*/
类型说明符 函数名(形参列表)
参数说明
{
}
形式参数:在定义函数时,函数名后面括号中的变量名称为形式参数
实际参数:在函数调用时,函数名后面括号中的表达式称为实际参数
函数的返回值决定于函数定义时的返回类型。
在被定义的函数中必须执行函数的行参类型。
声明 :int fun(参数列表);参数列表的变量名可以不写,但要写出类型。
定义 :
int fun(参数列表)
{
函数的实现。。。。
}
传值调用
int swap(int x,int y);
swap(a,b);
传址调用
int swap(int *x,int *y);
swap(&a,&b);
只需要取值来进行运算取得结果时,使用传值调用
需要对于原数据进行诙谐的情况,使用传址调用
使用指针作为函数参数传递即为传址调用是错误的说法。
void swap_(int *x,int *y) //可能会发生溢出
{
*x = *x + *y;
*y = *x – *y;//x ===>y
*x = *x-*y;//y >===x;
}
void swap_3(int *x,int *y) 推荐使用
{ //x:1010 y:0101
*x = *x ^ *y;
*y = *x ^ *Y;
*x = *x ^ *y;
}
swap_2(int *x,int *y) 可能会有溢出,不能等于0
{ //x:10 y:2
x* = *x * *y ;
*y=*x/*y;
*x=*x/*y;
}
函数说明(声明):包括函数名,函数类型,和函数参数类型,可不指定行参名。
在函数调用中
#include<stdio.h>
int fun1(int n)
{
return n;
}
int fun2(int n)
{
// printf(“in fun2()\n”);
}
int main(void)
{
int res1 = fun1(100);
int res2 = fun2(100);
printf(“res1:%d\n”,res1);
printf(“res2:%d\n”,res2);
return 0;
}
当注释掉printf(fun2)这句时,输出为100,100,打印的res原本的fun1中return 寄存器的结果,
当不注视时,输出为100 ,10,而这里打印的是fun2调用printf,printf中return 寄存器的结果,也就是printf打印的字符总数。
返回过程中,首先将返回结果保存至return 寄存器,永远不会被清空,都是覆盖。
不使用return 语句,返回结果为最后一次使用return 寄存器的结果。
在设计函数的时候记得主调调被调这样的过程越少越好。因为栈空间会越来越深。—-注意考虑递归过程
ADT和黑盒
黑盒测试分类:
正确性
可用性
边界检查
性能测试: 3s以下是比较好的,3-5s是可以接受的,>5s用户就要来找你!
压力测试
兼容性测试
网络安全
完整性?
方法:穷举法,
白盒测试
从源代码入手,每个逻辑分支都必须测试,每个分支都运行至少一边,检查算法,溢出,优化等等问题。
ADT:抽象数据类型(abstract data type):用于描述生活中的一些抽象的数据类型
问题一:
Char *strcpy() 跟char* strcpy()有什么区别 ——没区别
char *des跟char* src又有什么区别 ——没区别
问题二:
char *str1=”hello”
char *str2=NULL; ——一定要给指针一段空间才可以赋值。指向为空是不能赋值的。
*str2++ = *str1++
递归:函数直接或者间接的调用自己。
递归出口
递归过程