C语言:函数

一.函数设计的一般原则和技巧

1.原则上尽量少使用全局变量,因为全局变量的生命周期太长,容易出错,也会长时间占用空间。

2.参数命名要恰当,顺序要合理。一般情况下,目的参数放在前面,源参数放在后面。

3.如果参数是指针,且仅作为输入参数用,则应该在类型前面加const,以防止该指针在函数体内被意外修改。

例如

void str_copy(char * strDestination ,const char * strSorce)

4.在参数的入口处,对参数的有效性进行检查。

5.return 语句不可以返回指向栈内存的指针,因为内存在函数体结束时被自动销毁。

char * Func(void)
{
	char str[30];
	....
	return str;
}

str属于局部变量,位于栈内存,在Func结束的时候被释放,所以返回str将导致错误。

6.函数名与返回值类型在语句上不可冲突。

char c;
c = getchar ();
if(EOF == c)
{
	.....
}

按照getchar名字的意思,应该将变量c定义为char类型,但是getchar函数的返回值是int类型,

其原型是:

int getchar(void);

由于c是char类型,所以取值范围是[-128,127],如果宏EOF的值在char的取值范围之外,EOF的值将无法全部保存到c中,会发生截断,将EOF值的低8位保存在c里,这样if语句有可能总会失败。

7.传递给库函数的值必须检查其有效性。

(1)math.h 中的许多数学函数

负数不能传递给sqrt或log 函数
fmod函数的第二个参数不能为0

(2)toupper和tolower:当传递给toupper函数的参数不是小写字符是,某些实现能产生并非预期的结果

二.函数递归

void fun(int i)
{
	if(i>0)
	{
		fun(i/2);
	}
	printf("%d ",i);
}

int main()
{
	fun(10);
	
	return 0;
}

输出结果为:0 1 2 5 10
printf("%d ",i);语句是fun函数的一部分,fn函数执行几次,就要打印一次数据。
这个递归函数的展开结果:

void fun(int i)
{
	if(i>0)
	{
		//fun(i/2);
		if(i/2>0)
		{
			if(i/4>0)
			{
				....
			}
			printf("%d ",i/4);
		}
		printf("%d ",i/2);
	}
	printf("%d ",i);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值