今天是2月28日,做题第三天。道阻且长,行则将至;行而不辍,则未来可期!
第一题
static char a[2]={'1','2','3'};说法是否正确?
A---正确
B---错误
正确答案:B
解析:数组定义时,中括号内代表数组大小。这题数组越界,所以错误。
第二题
若有定义int x=3,y=2和float a=2.5,b=3.5,则表达式:(x+y)%2+(int)a/(int)b的值是()
A---0
B---2
C---1.5
D---1
正确答案:D
解析:(x+y)%2取模运算(取余数):(x+y)%2=5%2=1 。(int)a/(int)b除法运算(取商):(int)a/(int)b=(int)2.5/3.5=0(int型除法运算取"整数部分",忽略余数)(x+y) % 2 + (int) a / (int) b = 1 。
第三题
若有定义语句: int year=1009 , *p=&year ;以下不能使变量 year 中的值增至 1010 的语句是()
A---*p+=1;
B---(*p)++
C---++(*p)
D---*p++
正确答案:D
解析:++ 作为后缀时的优先级比* 高,结合律从左到右。因此D *p++ 是先p++, 而后*(p++)的。
++作为后缀时优先级和()一样高,结合律从左到右。结合律仅考虑同优先级时。因此(*p)++ 能够先得到1009 然后++。++ 作为前缀时的优先级和* 一样高, 结合律从右到左, 所以C可以写成++*p == ++(*p)的。
第四题
请问下面的程序一共输出多少个“-”()
int main(void)
{
int i;
for (i = 0; i < 2; i++)
{
fork();
printf("-");
}
return 0;
}
A---2
B---4
C---6
D---8
正确答案:D
解析:如图所示
最终的打印出数据是在进程退出的时候也就是return或者exit进行缓冲区刷新的时候打印出来的数据,6次调用printf函数共输出8次。
第五题
对于int j,a[10],*p;,下列语句中合法的是()
A---p=a;
B---p=a[5];
C---p=a[2]+2;
D---p=&(j+2);
正确答案:A
解析:A选项中,表示将数组a的首地址赋值给指针变量p。BC选项将一个int型变量直接赋值给一个int型的指针是不行的。D选项中j+2是一个右值,右值是不能进行取地址操作的。
第六题
以下代码在64位的机子上输出是()
#include <stdio.h>
int getSize(int data[])
{
return sizeof(data);
}
int main()
{
int data1[] = {1,2,3,4,5};
int size1 = sizeof(data1);
int* data2 = data1;
int size2 = sizeof(data2);
int size3 = getSize(data1);
printf("%d, %d, %d", size1, size2, size3);
return 0;
}
A---20,8,8
B---4,4,4
C---20,4,20
D---20,20,20
正确答案:A
解析:64位系统:int型占4个字节,指针占8个字节。data1[]数组大小是5,则4 * 5 = 20个字节;
data2指针,即8个字节;数组名data1作为函数getSize()的参数会退化成指针,即8个字节。
第七题
请问下面的程序一共输出多少个“-”()
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for (i = 0; i < 2; i++)
{
fork();
printf("-\n");
}
return (0);
}
A---2
B---4
C---6
D---8
正确答案:C
解析:
如图所示,共输出6个“-”。
第八题
以下对枚举类型名的定义中正确的是()
A---enum a={one,two,three};
B---enum a{a1,a2,a3};
C---enum a={'1','2','3'};
D---enum a{"one","two","three"};
正确答案:B
解析:枚举类型的定义如下,枚举在C/中,是一个被命名的整型常数的集合。
enum 枚举名
{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数]
} 枚举变量;
故本题选B。
第九题
32位机器中,以下结构的sizeof(P)为()
struct A
{
int a;
char b;
int c;
char d;
};
struct P
{
struct A w[2];
short b;
struct A* p;
}
A---26
B---38
C---40
D---30
正确答案:C
解析:这道题考察结构体对齐和填充:结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充。
struct A
{
int a; //4 bytes
char b; //1 bytes
//char pad[3] //3 bytes
int c; //4 bytes
char d; //1 bytes
//char pad[3] //3 bytes
}// total = 16 bytes
/* P中有结构体A的成员,但是计算时按照A中数据类型确定的*/
struct P
{
struct A w[2]; // 2 * 16 bytes
short b; //2 bytes
//char pad[2] //2 bytes
struct A* p; //4 bytes
} // total = 40 bytes
故本题选C。
我们努力的意义,就是为了遇见优秀的人和更优秀的自己!