`
yangyou230
  • 浏览: 1647878 次
文章分类
社区版块
存档分类

C语言变长参数

 
阅读更多

这段程序的输出是:
(a) 7
(b) 6
(c) 5
(d) 3
答案: (c)
在C编译器通常提供了一系列处理可变参数的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移性。这些宏包括va_start、 va_arg和va_end等。
采用ANSI标准形式时,参数个数可变的函数的原型声明是:
type funcname(type para1, type para2, ...)
这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分。type是函数返回值和形式参数的类型。
不同的编译器,对这个可变长参数的实现不一样 ,gcc4.x中是内置函数.
程序分析
va_list p;/*定义一个变量 ,保存函数参数列表 的指针*/
va_start( p , n); /*用va_start宏初始化变量p,va_start宏的第2个参数n, 是一个固定的参数,

必须是我们自己定义的变长函数的最后一个入栈的参数也就是调用的时候参数列表里的第1个参数*/
for (; j<n; ++j) /* j从1开始, 遍历所有可变参数 */
{ i = va_arg( p , int); /*va_arg取出当前的参数,并认为取出的参数是一个整数(int)*/
for (; i; i &=i-1 ) /*判断取出的i是否为0*/
++k; /* 如果i不为0, k自加, i与i-1进行与逻辑运算, 直到i 为0

这是一个技巧,下面会谈到它的功能*/}
当我们调用ripple函数时,传递给ripple函数的 参数列表的第一个参数n的值是3 .
va_start 初始化 p指向第一个未命名的参数(n是有名字的参数) ,也就是 is 5 (第一个).
每次对 va_arg的调用,都将返回一个参数,并且把 p 指向下一个参数.
va_arg 用一个类型名来决定返回的参数是何种类型,以及在 var_arg的内部实现中决定移动多大的距离才

到达下一个 参数
(; i; i&=i-1) k++ /* 计算i有多少bit被置1 */
5用二进制表示是 (101) 2
7用二进制表示 (111) 3
所以 k 返回 5(2+3),也即本题应该选c

因为i与i-1的最右边的那位(最低位) 肯定是不同,如果i1,i-1肯定是0,反之亦然.i & i-1 这个运算,在二相补的数字系统中,将会消除最右边的1位
分享到:
评论

相关推荐

    C语言变长参数C语言变长参数C语言变长参数

    很多技术人员都有在"技术细节"上"钻牛角尖"的"癖好",对此很多人褒贬不一;无论怎样,我也是属于这类人。C语言的变长参数在平时做开发时很少会在自己设计的接口中用到,...这里我们一起来挖掘一下C语言变长参数的奥秘。

    C语言 变长参数函数和变长参数宏debugLog

    日志输出函数,往往只接受具体的输出内容,但有时候还要为日志加上时间标志 就需要在打印日志是附加时间,如果改写函数或在调用前手动在日志内容前拼加时间,太麻烦了,所有的代码都要改. 还是在函数体中增加比较方便.

    C语言变长参数1

    在P.J.Plauger的"The standard C library"一书的第10章节中也有对stdarg实现的分析,那个版本虽然比较老,但我想应该是现有版

    C语言可变参数的使用

    C语言可变参数的使用,相关教程链接:http://blog.csdn.net/tennysonsky/article/details/53818527

    关于变长形参列表函数的设计与使用问题

    根据C语言的语法,一个函数可以没有形式参数,也可以有一个或多个参数,当然,也可以是类似于 scanf() 和 printf() 一样的带有变长形参列表的函数。显然,采用变长形参列表的函数能够提高程序的灵活性。针对目前 C 语言...

    c语言难点分析整理,C语言

    7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...

    C++中的变长参数深入理解

    变长参数的函数,即参数个数可变、参数类型不定的函数。设计一个参数个数可变、参数类型不定的函数是可能的,最常见的例子是printf函数、scanf函数和高级语言的Format函数。最近的一个项目中就遇到这么一个相关的...

    C语言程序设计(PDF格式)

    5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针表达式 94 6.3.1 指针...

    C语言系统化开发基础精讲

    19.函数的变长参数【对比java的变长参数】 20.函数的递归【C语言实现斐波那契数列】 21.案例:汉诺塔 22.文件包含【领略编译器宏之以小搏大】 23.案例:自定义头文件 24.宏函数 25.条件编译【掌握实际应用场景】 26....

    高级C语言详解

    7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...

    史上最强的C语言资料

    7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...

    C语言难点分析整理

    7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...

    C语言基础教程、小白学习教程

    覆盖了C语言的核心概念,包括语言简介、程序结构、数据类型、运算符、控制结构、函数、数组、指针、结构体与联合体、文件操作、预处理指令、宏定义、高级特性如变长参数列表和内联函数,以及调试和优化技巧。...

    C语言程序设计(高清PDF)

    5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针表达式 94 6.3.1 指针...

    单片机c语言应用100例

    6.3.8实例52:用外中断INT0测量负跳变信号累计数 6.3.9实例53-用外中断控制INT0控制P1口LED亮灭状态 6.3.10实例54:用外中断INT0中断测量外部负脉冲宽度 习题与实验 第7章串行通信技术 7.1串行通信的基本概念 7.2...

    高级C语言.PDF

    C中可变参数函数实现 .................................................................................................................... 34 8. C程序内存中组成部分 .......................................

    《C语言程序设计》-PDF格式

    5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针表达式 94 6.3.1 指针...

    C语言入门经典(第4版)--源代码及课后练习答案

    该资料是《C语言入门经典(第4版)》的源代码及课后练习答案 对应的书籍资料见: C语言入门经典(第4版) 基本信息 原书名: Beginning C: From Novice to Professional, Fourth Edition 原出版社: Apress 作者: ...

    从printf谈可变参数函数的实现

    一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒。printf这种对参数个数和参数类型的强大适应性,让人产生了对它进行...

Global site tag (gtag.js) - Google Analytics