錯題集
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