1. 在linux下64位c程序,请计算输出的三个sizeof分别是()
void func(char str_arg[100]) { cout<<sizeof(str_arg)<<endl; } int main(int argc,char* argv[]) { char str[]="Hello"; char *p=str; cout<<sizeof(str)<<endl; cout<<sizeof(p)<<endl; func("test"); return 0; }
- 5,5,8
- 6,6,4
- 6,8,4
- 6,8,8
答案:D
这里主要是区分sizeof运算符的测量对象。sizeof对数组求长度为数组的真实长度,字符串数组的长度要加上最后的'\0'字符。
sizeof(str)测量的是字符数组的占用长度,注意字符串后还有个\0,所以是6
sizeof(p)测量的是指针的占用长度,64位机器的指针占8个字节。
sizeof(str_arg)测量的是指针长度,因为这里是形参。
2.如果x=2014,下面函数的返回值是()
int fun(unsigned int x) { int n=0; while((x+1)) { n++; x=x|(x+1); } return n; }
- 20
- 21
- 23
- 25
答案:23
这个作用是对整型中0的个数进行统计,x=x|(x+1);的作用是每次循环把x的二进制中从右往左数的最后一位0变成1,直道变成全1的时候x+1就溢出为全0,循环结束。
2014的二进制是0000 0000 0000 0000 0000 0111 1101 1110,所以结果是23
还有类似的题目,迭代式为x=x&(x-1),作用是统计x二进制中1的个数
x|(x+1)的作用是对一个数中二进制0的个数进行统计
迭代式为x=x&(x-1),作用是统计x二进制中1的个数