1.
char a=101;
int sum=200;
a+=27;sum+=a;
printf("%d\n",sum);
上述代码运行结果是什么呢?
A: 327 B: 99 C: 328 D: 72
答案为D。
char为有符号类型,占1个字节,也就是8位,其中最高位是符号位,取值范围为-128~127;a=101+27=128,128表示为 1000 0000,作为补码放在内存中,符号位为1,在与int类型的sum进行加计算时会整型提升,高位补1,再转成原码 为-128,sum=200+(-128)=72
2.
int value = 1024;
char condition = *((char*)(&value));
if(condition) value += 1; condition = *((char*)(&value));
if(condition) value += 1; condition = *((char*)(&value));
printf("%d %d", value, condition);
上述代码运行结果是什么呢?
A: 1026 1 B: 1025 0 C: 1025 1 D: 1024 0
答案为D.
1024的二进制是:0000 0000 0000 0000 0000 0100 0000 0000;分析得*((char *)(&value))的作用是获取value变量的低 地址8位数据,若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的8位0,则condition=0,不执行两 个if语句,则value不变,还是1024;若数据是采用小端存储方式,则低地址对应的是数据的低位,即最右边的8位0,则 condition=0,不执行两个if语句,value值还是1024
3.
void func(char para[100])
{
void *p = malloc(100);
printf("%d, %d\n", sizeof(para), sizeof(p));
}
上述代码在32位环境下运行会是什么结果呢?
A: 4,4 B: 100,4 C: 4,100 D: 100,100
答案为A
para和p都是指针,32位机器上指针都是4个字节.
4.
#include <stdio.h>
void func(char *p) { p = p + 1; }
int main()
{
char s[] = {'1', '2', '3', '4'};
func(s);
printf("%c", *s);
return 0;
}
A: 2 B: 编译错误 C: 1 D: 无法确定
答案为C
调用函数func时传的是s的值,形参p的改变,并不会改变s本身,*s拿到的还是首地址的字符'1.
5.
已知数组D的定义是 int D[4][8]; 现在需要把这个数组作为实参传递给一个函数进行处理。下列可以作为对应的形 参变量说明的是【多选】( )
A: int D[4][] B: int *s[8] C: int(*s)[8] D: int D[][8]
答案为CD.
数组D是一个二维数组,函数传参时数组名退化为首元素地址,就是第一行的地址,是一维数组的地址,为int(*)[8]类型,C 正确,B选项是指针数组的,这里不行;若想写成数组的形式,则列不能省行可以省,D选型格式是对的,A选项不对.
6.
自守数是指一个数的平方的尾数等于该数自身的自然数。请求出n(包括n)以内的自守数的个数.
#include <stdio.h>
#include <math.h>
int main()
{
int n;
while(~scanf("%d", &n)) {
long count = 0, base = 10;
for (int i = 0; i <= n; i++){
long pow_n = pow(i, 2);
if (i == base) base *= 10;//两位数的时候成为100,三位数的时候成为1000....
if (pow_n % base == i) count++;
}
printf("%d\n", count);
}
return 0;
}
这里我们采用取模的方式进行对比。