15. C语言&数据结构与算法(99道)***4***

4.综合题(18道)

4.1下面代码输出是几?
int main()  
{  
    int j = 2;  
    int i = 1;  
    if(i = 1) j = 3;  
    if(i = 2) j = 5;  
    printf("%d", j);  
}  

答案:输出为5。

解读:注意if的条件语句用的是赋值符“=”而不是等号“==”,因此条件一直为真。


4.2负数和正数的反码、补码分别是什么?
(1)负数的反码:对原码除符号位外的其余各位逐位取反就是反码。
(2)负数的补码:负数的补码就是对反码加1。
(3)正数的原码、反码、补码都一样。

4.3编译和链接有什么不同?(如对外部符号的处理)
(1)编译(+汇编)生成的是目标文件(*.o)。编译过程中对于外部符号(如用extern跨文件引用的全局变量)不做任何解释和处理,外部符号对应的就是“符号”。
(2)链接生成的是可执行程序。链接将会解释和处理外部符号,外部符号对应的是地址。


4.4函数参数的传递方式有几种?
(1)两种:值传递、指针传递。
(2)严格来看,只有一种传递,值传递,指针传递也是按值传递的,复制的是地址。

4.5局部变量能否和全局变量重名? 
答案:能,局部会屏蔽全局。要用全局变量,需要使用“::”。
注意:对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。


4.6如何引用一个已经定义过的全局变量? 

答案:可以用引用头文件的方式(不建议,可能会造成重复定义),也可以用extern关键字。

注意:

(1)如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错。

(2)如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在链接期间报错。


4.7全局变量可不可以定义在可被多个.C文件包含的头文件中?

答案:可以,但要将该全局变量定义为static全局变量,否则会重复定义,但此时没有达到一般意义上的全局变量的效果,而是静态全局变量。

注意:建议不要在头文件中定义变量,只做变量的声明。


4.8语句for( ; 1 ; )有什么问题?它是什么意思?

在C语言中没问题,和while(1)相同,因为for循环中只要中间的表达式的值为TRUE即可。


4.9下面代码输出是几?

for(i = 0; i < 2, i < 3, i < 4; i++)  
     printf("%d \t", i);    

答案:输出:0    1    2    3   

解读:for中间的表达式为逗号表达式,整个表达式的值为最后一个式子的值,也就是说只要满足 i < 4 则整个表达式成立,for循环即可继续。


4.10 ’0’ASCII码为48’A’ASCII码为65’a’ASCII码为97

4.11下面代码输出结果是什么?

void main()   
{   
    char *p1 = “name”;   
    char *p2;   
    p2 = (char*)malloc(20);   
    m

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

包含241道笔试面试真题详解,还有岗位及校招介绍,简历制作、笔试准备、面试准备的经验分享,以及嵌入式软件工程师技能树解读。你想知道的所有关于嵌入式求职的问题,几乎都可以在这里找到答案。 订阅即赠送学习笔记、简历模板、面试提纲模板、内推机会,需要的同学点击我头像私信即可!

全部评论
在4.15中memcpy(a + 3, a, 5);函数只能从地址a开始拷贝5个字节到地址a+3,因为int占四个字节,所以只能拷贝一个完整的int和一个int的低地址字节。 如果把数组改成int a[10]={0,300,2,3,4,5,6,7,8,9}  300的二进制为100101100  由于memcpy(a + 3, a, 5)只能拷贝走300的低地址的数据,在小端存储模式下,低地址存储的是低位字节,所以只能把00101100(44)拷贝到a+3。 最后读取到的结果是0 300 2 0 44 5 6 7 8 9  而不是像解读中的拷贝两个完整的数字
21 回复 分享
发布于 2021-04-15 20:46
4.5那里就是C语言可以使用“::”访问到全局变量吗?命名空间只有C++才有吧?
3 回复 分享
发布于 2022-09-01 16:01 广东
4.14是什么意思,没看懂
2 回复 分享
发布于 2023-04-24 16:12 广东
void main()    {        char *p1 = “name”;        char *p2;        p2 = (char*)malloc(20);        memset (p2, ‘0’, 20);        while(*p2++ = *p1++);        printf(“%s\n”, p2);    }    请问这个跳出while时候是    是啥样的呀?这一点不太明白   谢谢
2 回复 分享
发布于 2021-07-08 09:49
佬,14的答案对应的应该是8位对齐吧?8字节对齐不该align=64吗
点赞 回复 分享
发布于 2024-02-20 13:18 美国
4.11 char *p1 = “name”; 要加const
点赞 回复 分享
发布于 2022-11-24 14:20 重庆
4.11程序有问题哦,printf停不下来,没有\0
点赞 回复 分享
发布于 2022-08-25 15:54 四川
4.9的考察的应该是逗号表达式的运算,不是有一个符合就好吧?
点赞 回复 分享
发布于 2021-09-10 09:22

相关推荐

评论
7
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务