这里给大家讲一下c语言部分遗留的选择题,用来巩固知识,一共13道题
1
答案解析
A:正确 不同的函数属于不同的作用域,因此不同的函数中定义相同名字的变量不会冲突
B:正确 在C语言中,函数的形参一般都是通过参数压栈的方式传递的
C:正确 在函数内定义的变量,称为局部变量,局部变量只能在其定义的函数中使用
D:错误 复合语句中定义的变量只能在复合语句中使用
因此:选择D
2
答案解析
A:正确,形参按照值的方式传递,将来形参就是实参的一份临时拷贝,修改形参不会影响外部的实参
B:正确,形参按照指针方式传递,将来形参就是实参地址的一份拷贝,形参指向的是实参,修改形参指针指向的内容, 就是在操作实参
C:错误,记住C语言中,函数不能嵌套定义
D:正确,函数可以嵌套调用,即:A()中调用B(),B()中调用A(),但是要控制好,否则就成为无限递归
因此,选择C
3
C语言关键字:C语言定义的,具有特定含义、专门用于特殊用途的C语言标识符,也称为保留字
define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是C语言中的内容。 int、struct和continue都是C语言中包含的关键字。
因此:选择C
4.
答案是b,我带大家计算一下,只需要记住前置++,--先++或者--后使用,后置是先使用再++或者--
我们从a=5开始看,接着c=++a,前置++先++后使用,a先变成6赋值给c也是6
再下一行是一个逗号表达式,会将最后一个逗号之后的结果赋值给b,也就是说++c将c变成7,c++不变因为是后置(先使用后++),++a,a为7,a++不变,然后将7赋值给b,b为7,而c和a各有一个后置++会在赋值b之后使用,a和c变为8
最后一行就简单了,因为+的优先级高于+=,先算后边,也就是说a+c(这里看成a+c是因为后置++先使用后++),a+c是16赋值给b+=结果是7+16=23赋值后a会自增1也就是9
答案就是9 8 23了
5
这道题也很有价值,答案是a
全局变量i默认是0,i--之后i是-1,进入if比较的时候,记住sizeof返回值是无符号数,相当于是-1>4是否成立,如果你没有注意sizeof返回值是无符号数,那肯定选<
比较数字我们记住这几点就行
有符号数字的比较直接看大小,比如正数就是比负数大,5就是大于-1,-2就是大于-5
有符号和无符号数字的比较,会将有符号转化为无符号数,也就是看补码(全部都是数值位)直接得出二进制数字之和
无符号数的比较,会比较补码(二进制数字之和)比如-1的补码是全1,转化无符号数就是42亿,42亿肯定比4大,所以选a大于
6
选B,函数定义至少也得有参数,所以只能选B
CD前半句压根就不是定义而是声明,A选项参数列表的第二个参数错了。应为char *,B选项正确。需要说明的是,对于函数名来说,前面的&和*都会被忽略,所以fun前面加不加取地址都没区别。
7
D
“调用指针”、“指向函数”是什么鬼……D选项简直逻辑鬼才!ABC就是基础概念,可以复习下。
回调函数是一种在编程中常见的概念,它是指将一个函数作为参数传递给另一个函数,并在特定的条件或事件发生时被调用执行的函数。
具体来说,回调函数是作为参数传递给其他函数的函数指针或函数对象。当满足特定条件或事件发生时,调用该函数指针或函数对象,以执行预定义的操作或逻辑。
8
union只有2字节,2字节的十六进制只有4位,所以答案CD排除。
这里是小端存储,低位字节放低地址处,高位字节放高地址处,而数组是从低到高排布,所以39是低位字节,38是高位字节,也就是0x3839,以16进制打印就是去掉0x
9
结构体向int对齐,7个short一共是14字节,对齐后是16字节。n是单独的4字节,由于是union,所以n与s共用空间,只取最长的元素,故占用16字节。
10
说明:结构体向最长的char对齐,前两个位段元素一共4+2位,不足8位,合起来占1字节,最后一个单独1字节,一共3字节。另外,#define执行的是查找替换, sizeof(struct _Record_Struct) * MAX_SIZE这个语句其实是3*2+3,结果为9,故选D。
11
#define执行查找替换,#if可以区分是否编译,#undef可以反定义,也就是取消#define宏定义的东西,#end并没有这玩意,只有#endif,故选D。
12
预处理的#define是查找替换(可以理解为*只跟第一个变量结合,第二个变量还是整形),所以替换过后的语句是“int*a,b;”,其中b只是一个int变量,如果要让b也是指针,必须写成“int *a, *b;”。而typedef没有这个问题,c、d都是指针。故选B。
13.
题干中提到了“编译”,说明是编译的上一步,那自然是预处理。故选A