1、 求函数返回值,传入 -1 ,则在64位机器上函数返回( )
int func(int x) { int count = 0; while (x) { count++; x = x&(x - 1);//与运算 } return count; }
A: 死循环 B: 64 C: 32 D: 16
解析:
x=x&(x-1)这个表达式执行一次就会将x的2进制中最右边的1去掉,在x变成0之前,表达式能执行几次,就去掉几个1,所以这个代码实现了求一个有符号整数二进制补码中1的
个数的功能,我们知道-1的补码是全1,而int类型4个字节32位.
正确答案:C
2、 请阅读以下程序,其运行结果是( )
int main() { char c='A'; if('0'<=c<='9') printf("YES"); else printf("NO"); return 0; }
A: YES B: NO C: YESNO D: 语句错误
解析:
'0'<=c<='9'并非判断x大于等于字符0,小于等于字符9,而是先执行'0'<=c,使用这个表达式的结果再和'9'比较,'0'的ASCII码值是48,'A'的ASCII码值是'65',故'0'<c是真值1,1
无疑是小于字符'9'的,最终是真
正确答案:B
3、 C语言中,下列运算符优先级最高的是 ( )
A: ! B: % C: >> D: ==解析:
单目运算符的优先级通常都比较高,具体情况可查阅运算符优先级表格正确答案:A
4、 如果 x=2014 ,下面函数的返回值是( )
int fun(unsigned int x) { int n = 0; while(x + 1) { n++; x = x | (x + 1); } return n; }
A: 20 B: 21 C: 23 D 25
解析:
这个作用是对整型中0的个数进行统计,x=x|(x+1);的作用是每次循环把x的二进制中从右往左数的最后一位0变成1,直道变成全1的时候x+1就溢出为全0,循环结束。2014的
二进制是0000 0000 000 0000 0000 0111 1101 1110,所以结果是23
正确答案:C
5、 有以下函数,该函数的功能是( )
int fun(char *s) { char *t = s; while(*t++); return(t-s); }
A: 比较两个字符的大小 B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度 D: 将s所指字符串复制到字符串t中解析:
循环在*t为0时停止,同时t++,t最后会停在字符串结束的'\0'之后的一个位置,t作为尾部指针减去头部指针就是整个字符串占用内存的字节数,包含\0在内;而c答案字符串长
度不包括最后的\0
正确答案:B
6、 若有“ float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; ”,则 *pa 的值是( )
A: 1.5 B: 2.5 C: 3.5 D: 4.5解析:
在*pa=a中指针pa指向a[0];pa++返回值仍是操作之前的值;*(pa++)取pa指向的地址的值;*(pa++)*=3将该值变为原来的3倍,也就是数组a的第一个值为4.5;由于pa++之后
pa指针移动了sizeof(float)个字节,所以pa指向a[1],所以值为2.5
正确答案:B
7、 关于指针下列说法正确的是【多选】( )
A: 任何指针都可以转化为void * B: void *可以转化为任何指针
C: 指针的大小为8个字节 D: 指针虽然高效、灵活但可能不安全正确答案:ABC
8、 请指出以下程序的错误【多选】( )
void GetMemory(char **p, int num) { if(NULL == p && num <= 0)//1 return; *p = (char*)malloc(num); return; } int main() { char *str = NULL; GetMemory(&str, 80); //2 if(NULL != str) { strcpy(&str, "hello"); //3 printf(str); //4 } return 0; }
A: 1 B: 2 C: 3 D: 4
解析:
第1处两种情况之一成立都是要返回的,应该用或,此处用与错误。在语句GetMemory(&str,100);中传入str的地址,在语句char*str=NULL;中str初始化为空指针,
但是str指针变量也有地址,所以参数char**p里面的p保存的是指针变量str的地址,所以
调用GetMemory函数之后,动态开辟的空间的地址存放在了str中,在函数返回之后没有
释放内存,但是这不会导致程序错误,只会导致内存泄漏。第3处用&str是错的,应该直
接用str,是刚申请下来的空间首地址,可以用来接收字符串的copy。
正确答案:AC
9、 求以下代码的输出
int main() { int a[5][5]; int(*p)[4]; p = a; printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); return 0; }
解析:
两个指针相减得到的是中间的元素的个数,又因为两个地址是小-大,所以为负数,再以整数的形式打印,第二个值就是-4
当以指针的形式打印,打印的就是-4的补码的十六进制表示形式,所以第一个值是fffffffc