作业讲解中的例题理解

第一题:

给出以下定义:

char arr[]="abcdef";

char str[]="'a','b','c','d','e','f'";

请选择()

A;数组arr与数组str等价

B;数组arr和数组str长度相同

C;数组arr的长度大于数组str的长度

D;数组arr的长度小于数组str的长度

答:正确选项应该是C,因为arr中除了abcdef之外还有一个\0元素,而str中只有七个元素,即abcdef,所以arr的长度要大于str的长度。

第二题:

源代码:

#include

int main()

int i;

{

i--;

if(i>sizeof(i))

    printf(">\n");

else

    printf("<\n");

return 0;

}

这道题目的答案最终是输出>。

理解:首先全局变量不初始化则系统默认它的大小为0,所以i=0,然后进入int main函数内,首先i--得到i=-1,然后比较if(i>sizeof(i)),虽然-1是一个负数,但它是整型,所以sizeof(-1)=4,按理来说-1应该是小于4的,那为什么会执行if语句呢?

这里就需要知道一个C语言的规则,即sizeof算出来的数值大小是一个无符号数,当一个有符号数和无符号数比较大小时,就要把这个有符号数当作无符号数处理,而-1的无符号数就很大了,它的原码为10000000000000000000000000000001,当这个开头的1不当作符号位而当作计数位时,那这个值就是2*31+2*0,这个值远远大于4,所以if语句是成立的,输出结果为>。

第三题:

源代码:

#include
int main()
{
    int a = 0x11223344;
    char* p = (char*)&a;
    *p = 0;
    printf("%x\n", a);
}

理解:首先得知道这个a的值是以16进制数表示的,11223344这八个数转换成二进制数每个数字有4个二进制位组成,即构成4个比特,所以两个数组组成8个比特即一个字节,故八个数组成了4个字节,然后再由字符指针变量p去存放a的地址,值得注意的是这个a的地址强制转换成了字符指针变量类型,故每次只变化一个字节,一个字节一个字节的变动,然后重点是0x11223344它的地址顺序,即它是怎么顺序摆放的,0x11223344就是0001 0001 0010 0010 0011 0011 0100 0100的二进制顺序,所以地址由小到大的顺序就是44332211,故要执行*p=0操作时,改变的一个字节的变动是改变44两个数字,将它们改为0,故最终的输出结果就是00332211,然后再将它们转化为16进制,就是11223300。

你可能感兴趣的:(html)