C语言专项错题集
2020-08-10 记录
#1
1 struct student{ 2 int num; 3 int age; 4 }; 5 struct student stu[3]={{6001,20},{6003,21},{6005,19}}; 6 struct student *p=stu;
A.++(p->num)
B.(p++)->num
C.(*p++).num
D.(*++P).num
上述表达式中可以表示值6003的是D。
解析:
有必要先搞清楚‘*’运算符和‘++’运算符的优先级:

访问值的方法有2种:
p->num或(*p).num
注意成员选择运算符'.'的优先级高于取值运算符‘*’,所以(*p)要加括号。
对于A选项:++(p->num)。表示取数组第一个元素的值(6001),然后+1;
对于B选项:(p++)->num。后缀自增运算符(++)与成员选择运算符(->)处于同一优先级,从左到右结合,但是指针偏移的操作直到表达式结束才会进行,
这个表达式相当于(p)->num;p=p+1;
对于C选项:(*p++).num。后缀自增运算符(++)优先级高于取值运算符(*),但是++直到表达式结束才会进行,这个表达式相当于(*p).num;p=p+1;
对于D选项:(*++P).num。前缀自增运算符(++)优先级和取值运算符(*)一样,先执行p=p+1操作,相当于(*(p+1)).num;
#2
i最后等于多少?
1 int i = 1; 2 int j = i++; 3 if( (i>j++) && (i++ == j) ) 4 i+=j;
i=1;
执行int j = i++;后,j = 1; i = 2;
在条件判断中,i > j++为真,该表达式结束后,j=2;继续判断下一个条件,i++ == j;此时i = 2, j = 2;为真,表达式结束后,i = 3.
i += j;
最后i = 3 + 2 = 5.
#3
64位机上,一个结构体有三个成员,分别是char、int、short类型,三个成员位于结构体中不同位置时整个结构体的大小可能是下面哪些值?
解析:
在64位机上,char占1个字节,int占4个字节,short占2个字节。
这题考查内存对齐的概念:
百度百科:每个平台上的编译器都有自己的默认"对齐系数"。程序员可以通过预编译命令#pragma pack(n)来改变这一系数。n可以是1,2,4,7,16。
如果没有指定对齐系数,按编译器默认的来,还真不好说,这题是认为默认对齐系数是4,然而我用gcc测出来,默认对齐系数是8。呵呵。
反正一个结构体的大小必须是对齐系数的整数倍。
1.对于结构体的各个成员,第一个成员的偏移量是0,排列在后面的成员其当前偏移量必须是当前成员类型的整数倍
2.结构体内所有数据成员各自内存对齐后,结构体本身还要进行一次内存对齐,保证整个结构体占用内存大小是结构体内最大数据成员的最小整数倍
按照4字节的默认对齐系数:
排列方式有:
char short int:char1, 空1,short2, int4(数字表示字节数)= 8字节
char int short:char1, 空3,int4, short2, 空2 = 12字节
short char int:short2, char1, 空1,int4 = 8字节
short int char:short2, 空2, int4, char1, 空3 = 12字节
int char short:int4, char1, 空1,short2 = 8字节
int short char:int4, short2, char1, 空1 = 8字节
这种情况下,可能值为8字节或12字节。
#4
若以下选项中的变量a,b,y均以正确定义并赋值,则语法正确的switch语句是?
A.
1 switch(a*a+b*b) 2 { 3 default:
break; 4 case 3:y=a+b; 5 break; 6 case 2:y=a-b; 7 break; 8 }
B.
1 switch(a+b) 2 { 3 case 1: 4 case 3: 5 y=a+b; 6 break; 7 case 0: 8 case 4: 9 y=a-b; 10 }
C.
1 switch(a+9) 2 { 3 case a: 4 y=a-b; 5 case b: 6 y=a+b; 7 }
D.
1 switch a*b 2 { 3 case 10: 4 y=a+b; 5 default: 6 y=a-b; 7 }
解析:
对于A选项,看到default语句放到开头感觉怪怪的,不过不影响,它还是最后运行的;
对于B选项,虽然最后没有break语句,但是它还是对的,没有语法错误。。。栽在这里了;
对于C选项,case后面必须是常量(数字,字母,常量表达式);
对于D选项,switch后面的表达式没有括号,这就离谱了。
#5
以下多线程对int型变量x的操作,哪几个需要进行同步()?
A.x=y B.++x C.x=1 D.x++
解析:
A,B,D需要同步
非原子操作的都需要同步。
A.x=y /*每个线程使用的y值不一样,可能出现覆盖*/
B.++x /*x; x=x+1;可能同时存在2个线程读取x,然后写入x+1,覆盖写*/
C.x = 1 /*每个线程的赋值是一样的*/
D.x++ /*和B选项类似/
(关于多线程的还是比较迷。。。)

浙公网安备 33010602011771号