- 考查逗号表达式
main() { int a, b,c, d; a=3; b=5; c=a,b; d=(a,b); printf("c=%d" ,c); printf("d=%d" ,d); } 这段程序的输出是: (a) c=3 d=3 (b) c=5 d=3 (c) c=3 d=5 (d) c=5 d=5
应该选C。
main() { int x,y,z; x=y=1; z=x++,y++,++y; printf("%d,%d,%d ",x,y,z); }
考查自加操作(++)
main() { int i=3; int j; j = sizeof(++i+ ++i); printf("i=%d j=%d", i ,j); } 这段程序的输出是: (a) i=4 j=2 (b) i=3 j=2 (c) i=3 j=4 (d) i=3 j=6
选C。参考 sizeof用法汇总
此题考查的是C的变长参数
#include<stdarg.h> int ripple ( int , ...); main() { int num; num = ripple ( 3, 5,7); printf( " %d" , num); } int ripple (int n, ...) { int i , j; int k; va_list p; k= 0; j = 1; va_start( p , n); for (; j<n; ++j) { i = va_arg( p , int); for (; i; i &=i-1 ) ++k; } return k; } 这段程序的输出是: (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中是内置函数.
关于可变长参数,可参阅
http://www.upsdn.net/html/2004-11/26.html
http://www.upsdn.net/html/2004-11/24.html
程序分析
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= 9 = 1001
i-1= 1000
(i-1) +1 = i
1000
+1
1 001
因为i与i-1的最右边的那位(最低位) 肯定是不同,如果i1,i-1肯定是0,反之亦然. i& i-1 这个运算,在二相补的数字系统中,将会
消除最右边的1位
- 求一个数中1的个数
参考 http://blog.chinaunix.net/uid-26922071-id-3799818.html
#include <stdio.h> int main(int argc, const char *argv[]) { int i = 9; int k = 0; while(i) {
i&=(i-1); k++; } printf("k=%d ",k); return 0; }