只针对本人!!!!!!!!!!!!!!!!!!!!!!!!
一、下列程序执行后的输出结果是()
int main()
{
char x = 0xFFFF;
printf("%d\n",x--);
}
答案:-1
解析:
因为char只有一个字节,那么它只能存2位16进制,由于Windows下一般是小端存储模式,所以我们存的是后面的两位,即0XFF,而计算机的存储方式是以二进制的补码存储的,所以0XFF存到计算机里面为(16进制没有符号位,即就是补码):1111 1111
而我们输出的时候是以十进制输出,那么最高位就代表符号位,那么我们就需要求出它的原码(即补码的补码):1 000 0001
输出结果为:-1。
二、下面C程序的输出结果是()
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr=(int *)(&a + 1);
printf("%d, %d",*(a + 1), *(ptr -1 ));
return 0;
}
答案:2,5
解析:
*(a + 1):直接用数组名a代表数组首元素的地址,+1再解引用是数组第二个元素的内容
(&a + 1):对整个数组取地址代表数组的地址,对数组的地址+1,可以将整个数组看成一个数据类型,+1则地址往后移动该数据类型的大小,则ptr指向5的后一位,由于ptr为int类型的指针,-1往前偏移4个字节,指向5,再解引用结果为5
三、关于局部变量和全局变量,下列说法错误的是()
答案:在全局变量定义之前是无法引用全局变量的。(此处的之前是位置上不是时间上)
解析:
若在全局变量定义处之前的函数想引用该全局变量,则需要在函数中用关键字extern作外部变量声明。