1.题1
int fun( int x)
{
int n = 0;
while (x + 1)
{
n++;
x = x | (x + 1);
}
return n;
}
int main()
{
int ret = fun(2014);
printf("%d", ret);
return 0;
}
上述代码运行结果是什么呢?
我们来分析一下:这里的fun函数有一个while循环,其判断条件为x+1会使每次的x加1,我们的if中x=x|(x+1),这里的按位或操作符,计算规则为只要有1就为1,同时为0才为0,这里的n是用来记录总共循环的次数。第一次循环:
x的补码为:0000 0000 000 0000 0000 0111 1101 1110
x+1的补码为:0000 0000 000 0000 0000 0111 1101 1111
经过按位或运算后的补码为:0000 0000 000 0000 0000 0111 1101 1111
第二次循环:
x的补码为:0000 0000 000 0000 0000 0111 1101 1111
x+1的补码为:0000 0000 000 0000 0000 0111 1110 0000
经过按位或运算后的补码为:0000 0000 000 0000 0000 0111 1111 1111
我们发现每循环一次,补码中就会少一个0,所以这个fun函数其实是计算x的补码中0的个数,while循环的判断条件是x+1=0,当x的补码全部为1是值为-1,此时停止循环,n记录了循环的次数,也是该补码中0的个数。
我们运行看看:
2.题2
以下选项中,对基本类型相同的两个指针变量不能进行运算的运算符是( )
A: + B: - C: = D: ==
我们来分析一下:"两个指针的基本类型相同"是指两个指针变量的存储地址的数据类型相同。例如,如果两个指针变量都是整型指针(int*),则它们的基本类型相同。这意味着这两个指针变量都可以指向相同类型的内存地址,并且可以在需要时进行赋值、比较或者进行其他操作。所以A是错的,因为两个地址相加无意义也可能越界,所以规定不允许指针相加。B选项,可以求出两个数据元素储存位置之间的相隔同数据类型的元素个数,C选项,赋值,没问题,D选项,判断两指针是否相同。
3.题3
int fun(char *s)
{
char *t = s;
while(*t++);
return(t-s);
}
有以下函数,该函数的功能是( )
A: 比较两个字符的大小 B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度 D: 将s所指字符串复制到字符串t中
我们来分析一下:fun函数中while循环的条件为*t++,所以这个*t为\0时循环停止,并返回首元素地址减去尾元素地址,我们知道首减尾指针结果为其中元素的个数,所以这个函数可以计算s指针指向的字符串的元素个数,所以B正确,但是C选项不包括\0.
4.题4
int main()
{
float a[3] = { 1.5,2.5,3.5 };
float *pa = a;
*(pa++) *= 3;
printf("%.1f", *pa);
return 0;
}
上述代码的运行结果是什么呢?
A: 1.5 B: 2.5 C: 3.5 D: 4.5
我们来分析一下:一开始pa保存的是a[0]的地址,*(pa++)*=3,将a[0]放大三倍,此时的*pa大小为4.5,但是由于还有后置++的存在此时的pa就指向a[1]所以*pa为2.5
5.题5
单词倒排
void upendprint(char*s)
{
if (*s != '\0')
{
upendprint(s + 1);
printf("%c", *s);
}
}
int main()
{
char arr[1000] = { 0 };
gets(arr);
upendprint(arr);
return 0;
}
我们来测试一下:
大家也可以试试。