C++程序设计笔试题详细阐释

1、数组指针地址偏移了多少

main()
{int a[10]={1,2,3,4,5,6,7,8,9,0},*p;
p=a;
printf(“%x\n”,p);
printf(“%x\n”,p+9);
}
该程序有两个printf语句,如果第一个printf语句输出的是194则第二个语句输出的结果是?

解析:

考察内容

数组地址连续分配;

每个连续的内存空间大小一样;

此题地址表示是16进制计算

解答

12和24是这样的出来的:
32位机中,int型2个字节,所以是2*9=18=12(十六进制)
64位机中,int型占4个字节,所以是4*9=36=24(十六进制)

所以最后:24+194=1 11 8=1B8

2、switch分支语句串联执行(default也是如此)

#include <stdio.h>
main()
{ int c=0,k;
for (k=1;k<3;k++)
switch (k)
{ default: c+=k;
case 2: c++;break;
case 4: c+=2;break;
}
printf(“%d\n”,c);
}

考察内容:

switch分支语句串联执行

default也是如此

解答:答案为3

default: c+=k;break;
case 2: c++;break;
case 4: c+=2;break;

答案为2

case 2: c++;break;
case 4: c+=2;break;

default: c+=k;

答案为2

所以:

分支语句按顺序执行只在遇到break返回

           default放在最开始就执行default

          default放在最开始有break执行完返回

如果前一条满足且没有break将串联执行后一句

若都不满足,最后有default语句则执行default

3、关系表达式的顺序

#include  <stdio.h>
intmain ( )
{
int  n=2,k=0;
while(k++&&n++>2);
printf(“%d  %d\n”,k,n);
}
考察内容:

关系表达式&&前面为假就不执行后面的了

while(k++&&n++>2);后面的分号表名与后面printf语句没有关联无论怎样都要执行printf的

解析

while(k++ && n++ >2); 执行这个的时候k=0
k++执行时,先取k的值是0,为假,所以&& n++ >2就不执行了,再将k的值加1

标签