【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
4、宏替换(直接换)
考察内容:
宏替换是直接换
解析:
#define add(x) x + x-----------------答案为56
#define add(x) (x) + (x)-----答案为80
#define宏是直接替换,不会先给你计算的
add(a+b) = a+b*a+b
d = add(a+b)*c = a+b*a+b*c =4+4*6+6*7 = 4+24+42 = 70