错题集
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