[牛客网]错题整理(6)

来源:互联网 发布:长沙哪里有学美工的 编辑:程序博客网 时间:2024/05/17 03:53

错题集

1.以下程序段执行后结果是()

#include<stdio.h>

void main()

{

    short *p,*q;

    short arr[15]={0};

    p=q=arr;

    p++;

    printf("%d,",p-q);

    printf("%d,",(char*)p-(char*)q);

    printf("%d",sizeof(arr)/sizeof(*arr));

}

答案:1,2 15

解析:指针自增、自减每次移动的偏移量是指针所指向对象的字节大小,所以p++与q的偏移量是2个字节。

指针相减的值是指针地址的偏移除以指针每次移位的大小;

1)p-q=1;偏移量为2个字节,每次移动2个字节,所以为1

2)(char *)p-(char *)q,指针的偏移没变,但是每次指针移位是按照(char*)类型移动,即每次移动1个字节,所以是2

3)数字每次元素2个字节,所以sizeof(arr)为30,sizeof(*arr)为2

 

2.下面程序输出是什么

int main()

{

    bool first=true;

    int sum=0;

    int value;

    unsigned short i=0xFFFF;

    for (;i>=0;--i)

    {

        if (first)

        {

            value=65536;

            sum+=value%3;

            first=false;

        }

        else{

            sum+=--value%3;

            if (value<=0)

            {

                cout<<sum<<","<<i;

                break;

            }

        }

    }

    return 0;

}

答案:65536,65535

解析:

True只经历一次, i=65535,sum=1,value=65536,

False第一次循环,i=65535-1,sum=1+0 =1,value=65535,

False第二次循环,i=65535-2,sum=1+2=3,value=65534,

False第三次循环,i=65535-3,sum=3+1=4,value=65533,

False第四次循环,i=65535-4,sum=4+0=4,value=65532,

False第五次循环,i=65535-5,sum=4+2=6,value=65531, ………

补充一点:for(;i>=0;--i)由于是unsigned无符号,所以并不是i<0退出循环,是当i=0后下一个i的值从最初的0xffff从头再开始(无法表示-1),也就是说如果for循环里没有break即死循环。-1 = 1000 0000 0000 0001B = 补码:1111 1111 1111 1111 = 无符号则为0xffff,存储方式为补码形式

【i】value:65535~0,而i: 65534~0,(还差一次循坏),所以当value=0时i=初值0xffff=65535;

【Sum】的规律:从false第二次开始看(循环65534~0共65535次),(组1)3,4,4, (组2)6,9,9, (组3)7,10,10…三个为一组,所以65535/3=21845…0,表示21845组第二个数值,sum=21845*3+1=65536

 

3.有定义如下:

static char x[ ]= "abcde";

static char y[ ]={ 'a', 'b', 'c', 'd', 'e'};

则正确的说法是?

答案:x数组的长度大于y数组的长度

解析:对于 static char x [ ]= "abcde" ;而言,长度为6,因为 "abcde" 是字符串,末尾默认有'\0'结束符,长度为6。

对于 static char y [ ]={ 'a' , 'b' , 'c' , 'd' , 'e' };而言,是将每个字符逐一赋值到y[]中,所以长度为5。

 

4.下面一段程序的输出结果是?

#define product(x) ((x)*(x))

int main()

{

    int i = 3, j, k;

    j = product(i++);

    k = product(++i);

    printf("%d %d", j, k);

    return 0;

}

答案:12 42

解析:这题在不同的编译器会有不同的结果:

第一种情况:

j = (i++*i++);=>3*4  第一次i++返回3 第二次i++返回4 最后i的值为5

k = (++i*++i);=>6*7  第三次++i返回6  第四次++i 返回7 最后i的值为7

但是还有一种编译器的分析情况是这样

j=(i++*i++)=>3*3 也就是说运行时直接使用的i的值3 但是i最终在内存的值还为5

毕竟加了2次

k = (++i*++i);=>7*7  运行时先计算的++i,然后取出i的最终值7 在计算乘法。

还有一种情况为:

j=(i++*i++)=>3*3 也就是说运行时直接使用的i的值3 但是i最终在内存的值还为5

毕竟加了2次

k = (++i*++i);=>5*5  运行时先取出i的值计算乘法,然后i的的值自增2次

终值7

 

原创粉丝点击