[牛客網]錯題整理(6)

錯題集

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章