C语言非常道 6.4习题解答



关于 #include "stdarg.h" 相关知识小结:

函数:tppedef va_list char * ;
va_list al;
va_start(al, fmt) 使 al 指向变参函数中最后一个已知参数(从右往左数的第一个已知参数)
va_arg(两个参数) ,第一个参数是:被声明为 va_list 类型的变量,第二个参数则是类型名,要想获得每一个变参,最重要的是知道它的类型,在程序翻译时,这个宏被扩展为一个表达式,所以它可以直接作为运算符 += 的右操作数

开始,令va_list类型的变量ap指向最后一个已知参数,此后,每调用一次va_arg,都会使ap指向下一个参数(变参)并取得(计算出)他的值。
va_end(); 使用va_start();后一定要使用va_end();才能保证返回时一切正常

书P190上下,例程以及例题结合理解。

计算传入参数的加和,普通的写法

使用 #include " stdarg.h "

计算传入参数的加和

所调用的函数在主函数之前,利用函数定义的方式声明

c 复制代码
#include "stdio.h"
#include "stdarg.h"

int sum_ints(unsigned int count,...)
{
	int sum = 0;
	va_list ap; 
	va_start(ap,count);
    while(count--) 
    	sum += va_arg(ap,int);         //第一个参数是变量,第二个参数是变量的类型
    va_end(ap);
    return sum;                        //return 最终返回值变量类型和函数类型必须是统一的
}

int main()
{ 
    int x,y;
	x = sum_ints(2,100,200);
	y = sum_ints(0);
	printf("%d, %d\n",x,y);
	
	return 0;
}

函数定义在主函数之后,并且利用普通函数类型定义的方式声明子函数

感觉在这个程序里面这样去定义就是多此一举,但是如果在一个这种类型很多的函数里面,就会非常方便

c 复制代码
#include "stdio.h"
#include "stdarg.h"

typedef int F(unsigned int count,...);

int main()
{ 
    F sum_ints;
    int x,y;
	x = sum_ints(2,100,200);
	y = sum_ints(0);
	printf("%d, %d\n",x,y);
	
	return 0;
}
int sum_ints(unsigned int count,...)
{
	int sum = 0;
	va_list ap; 
	va_start(ap,count);
    while(count--) 
    	sum += va_arg(ap,int);         //第一个参数是变量,第二个参数是变量的类型
    va_end(ap);
    return sum;
}
相关推荐
沪漂的码农18 分钟前
MM32F0144芯片ADC电压采样策略详解
c语言·单片机·嵌入式硬件
oioihoii6 小时前
现代C++:一场静默的革命,告别“C with Classes”
c语言·jvm·c++
万事可爱^10 小时前
GitHub爆火开源项目——RustScan深度拆解
c语言·开发语言·rust·开源·github·rustscan
冉佳驹11 小时前
数据结构 ——— 八大排序算法的思想及其实现
c语言·数据结构·排序算法·归并排序·希尔排序·快速排序·计数排序
异步的告白13 小时前
C语言-数据结构-2-单链表程序-增删改查
c语言·开发语言·数据结构
超级无敌大学霸13 小时前
二分查找和辗转相除法
c语言·算法
云知谷15 小时前
【软件测试】《集成测试全攻略:Mock/Stub 原理 + Postman/JUnit/TestNG 实战》
c语言·开发语言·c++·软件工程·团队开发
小龙报17 小时前
《算法通关指南C++编程篇 --- 初阶函数递归专题》
c语言·开发语言·c++·算法·创业创新·学习方法·visual studio
星轨初途18 小时前
《数据结构二叉树之堆 —— 优先队列与排序的高效实现(2)(下)》
c语言·开发语言·数据结构·经验分享·笔记·性能优化
Shylock_Mister18 小时前
ARM与x86交叉编译实战排错指南
linux·c语言·arm开发