啊C啊C我爱你-1

C++软件与嵌入式软件面经解析大全(蒋豆芽的秋招打怪之旅)


本章讲解点

  • 1.1 熟悉的陌生人——main函数

  • 1.2 If else——易错细节分辨

  • 1.3 Switch、break——相爱相杀的故事

  • 1.4 For、while、do-while——傻傻分不清楚

  • 1.5 枚举

  • 1.6 结构体与共用体

  • 1.7 函数——原来你是这样的函数

  • 1.8 全局变量与静态变量详解

  • 1.9 数据类型详解

  • 1.10 类型转换

  • 1.11 谁先谁后——把人搞疯的优先级

  • 1.12 震惊——位运算还可以这样用

  • 1.13 面试技巧讲解

  • 1.14 数组指针与指针数组

  • 1.15 指针与字符串

  • 1.16 指针与函数

  • 1.17 指针与结构体

  • 1.18 内存布局

  • 1.19 野指针与内存泄露

  • 1.20 野指针与内存申请

  • 1.21 内存碎片


受众:本教程适合于C/C++已经入门的学生或人士,有一定的编程基础。

本教程适合于互联网嵌入式软件求职的学生或人士。

img

故事背景

img

蒋 豆 芽:小名豆芽,芳龄十八,蜀中人氏。卑微小硕一枚,科研领域苟延残喘,研究的是如何炒好一盘豆芽。与大多数人一样,学习道路永无止境,间歇性踌躇满志,持续性混吃等死。会点编程,对了,是面对对象的那种。不知不觉研二到找工作的时候了,同时还在忙论文,豆芽都秃了,不过豆芽也没头发啊。

隔壁老李:大名老李,蒋豆芽的好朋友,技术高手,代码女神。给了蒋豆芽不少的人生指导意见。

导 师:蒋豆芽的老板,研究的课题是每天对豆芽嘘寒问暖。

img

故事引入

img

导 师:豆芽,这篇稿子审好今晚给我。

蒋 豆 芽:好的(豆芽脸上笑嘻嘻(#^.^#))


蒋豆芽悄悄点开邮件,今晚面试海平面,豆芽可不敢掉以轻心。豆芽针对岗位要求的C语言狠狠恶补了一通。哼,看我豆芽怎么在线吊打面试官!!!


面 试 官:蒋豆芽啊,你好,请自我介绍一下。

蒋 豆 芽:阿巴阿巴阿巴。。。。。。

面 试 官:你说你熟悉C语言哈,你来说说main函数的参数int argc,char* argv[]分别代表什么意思?

蒋 豆 芽:emmmm

面 试 官:不会的吗?(微笑浅露)那换个题吧,我们来复盘一下你的笔试题,有一道题目是这样的,你还记得最后ij输出是多少?

int main(){  
    int i = -1, j = 2;  
    if (i > 0)  
        if (j > 3)  
            i++;  
    else  
        j++;  
        i -= j;  
}  

蒋 豆 芽:(支支吾吾)emmm,有点记不清了,我看像-43

面 试 官:(不置可否,笑容逐渐邪魅)我记得还有一道,你等等,对了,是这道,还记得最后result输出是多少吗?

int main(){  
    int i = 2;  
    int result = 0;  
    switch (i) {  
        case 1:  
            result = result + i;  
        case 2:  
            result = result + i * 2;  
        case 3:  
            result = result + i * 3;  
    }  
}  

蒋 豆 芽:这个我知道嘛,是4

面 试 官:(无言以对)你觉得上面代码哪里需要改进

蒋 豆 芽:(疑惑)我看看哈,哪里需要改进?emmmm

面 试 官:(无言以对)豆芽,回去等通知吧,有消息会联系你的。


经过惨烈吊打,蒋豆芽当然不会收到任何消息,蒋豆芽感觉自己好像并不会C语言了。


蒋 豆 芽:(委屈)老李,我明明学过C语言,怎么感觉还是不会啊。

隔壁老李:因为一门语言入门很简单,但是要掌握其所有语言细节,却并非易事,这需要时间以及对语言的深入学习,只有掌握了语言的细节,才可以自信的说自己精通了一门语言。面试笔试常考这一类语言细节题,你掌握了语言细节,那么你就拉开了和别人的差距,细节决定成败啊。

img

1.1 熟悉的陌生人——main函数

img

隔壁老李:我们来复盘一下你的问题。main函数是我们最熟悉的函数,我们学习C语言,就是在main函数里写下了“hello world!”,但是main也是可以带参数的,常有两个参数,一个是int argc, 一个是char* argv[],而这个在我们看来就很陌生,所以main函数还真是熟悉的陌生人啊。

蒋 豆 芽:那这两个参数是用来干嘛的啊?

隔壁老李:第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数

第二个参数,char*型的argv[],为字符串数组,用来存放指向字符串的指针元素,每一个指针元素指向一个字符串参数。各成员含义如下:

  • argv[0]指向程序运行的全路径名

  • argv[1]指向在DOS命令行中执行程序名后的第一个字符串

  • argv[2]指向执行程序名后的第二个字符串

    。。。。。。

  • argv[argc-1]指向执行程序名后的最后一个字符串

  • argv[argc]NULL

蒋 豆 芽:(一脸疑惑)我们平时都是使用不带参数的main函数,那带参数的main函数又有什么作用呢?

隔壁老李:带参数的main函数可以通过使用命令行的方式来调用exe执行文件,并传入参数,这是linux操作系统下常见的调用程序的方式,我们通过命令行传入参数,那么某些关键的参数不用固定死,这样程序灵活性大大增强。下面我们通过一个例子来感受一下带参数的main函数如何使用。

隔壁老李:我们给出一个典型的例子

int main(int argc, char ** argv){  
    int i;  
    for (i = 0; i < argc; i++)  
        printf("Argument %d is %s\n", i, argv[i]);  
    return 0;  
}  

然后我们编译生成执行文件

img

隔壁老李:接着,我们打开命令行窗口,切换目录到我们的执行文件的目录下,我们输入参数:

"ConsoleApplication5.exe" a b c d

然后回车,就可以看到下面结果。

img

输出的就是我们输入的参数,那么我们输入的参数就可以人为定义,而main函数里就可以通过分支语句来处理不同的参数形式,使得我们的程序灵活性大大增强。

蒋 豆 芽:原来是这样啊,懂了,带参数的main函数和不带参数的main函数有着各自的适用场景,特别是在Linux操作系统下,带参数的main函数是很常见的形式。(有点激动)那老李,面试官问我的第二道题是怎么回事啊?我感觉自己应该没说错啊。不就是if-else简单分支语句,这我还能出错?

img

1.2 If else——易错细节分辨

img

隔壁老李:我们来看看第二题。

int main(){  
    int i = -1, j = 2;  
    if (i > 0)  
        if (j > 3)  
            i++;  
    else  
        j++;  
        i -= j;  
}  

if-else分支语句是C语言程序中必不可少的组成,理解清楚细节很有必要。If-else注意两个原则

  1. if-else最近匹配原则:else与其上面最近的一个if语句配对
  2. 如果没有大括号,if-else的作用域仅仅是紧跟的第一条语句

按照这两个原则,我们重新编排一下格式。

1.    int main(){    
2.        int i = -1, j = 2;    
3.        if (i > 0)    
4.            if (j > 3)    
5.                i++;    
6.            else    
7.                j++;    
8.        i -= j;    
9.    }  

你看这时我们的程序就很清晰了,那么程序的运行路径就应该是1->2->3->8,所以最后的输出是i=-3j=2。那么豆芽,考考你,如果初始值i=1j=2,程序的运行路径是如何的?

蒋 豆 芽:如果i=1,那么会走到4这里,按照第一条原则,else就近匹配,所以j=2,会运行到7这里,按照第二条原则,只有一条语句属于else的作用域,即j++这条语句,所以程序继续运行到8这里。最终整个运行的路径应该是1->2->3->4->6->7->8。最后的输出是i=-2j=3

隔壁老李:bingo!豆芽聪明!那豆芽看看下面一题是这么做的呢?

1.    int main(){    
2.        int i = 1, j = 4;    
3.        if (i > 0)    
4.            if (j > 3)    
5.                i++;    
6.            else{  
7.                j++;    
8.         i -= j;  
9.            }  
10.    }  

蒋 豆 芽:我们重新编排一下格式:

1.    int main(){    
2.        int i = 1, j = 4;    
3.        if (i > 0)    
4.            if (j > 3)    
5.                i++;    
6.     

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

<p> - 本专刊适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专刊适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 - 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共近400道,知识点讲解全面。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。 </p> <p> <br /> </p>

全部评论
大家在阅读过程觉得还不错的话,欢迎大家留言哦,多多留言,会变有钱。多多点赞,会变好看!
5
送花
回复
分享
发布于 2021-04-03 22:50
main讲得挺清楚的,enum的知识点也忘了,do while(0)在宏的用法和共用体都是第一次接触,不错不错
点赞
送花
回复
分享
发布于 2021-04-07 16:54
秋招专场
校招火热招聘中
官网直投
不错不错
点赞
送花
回复
分享
发布于 2021-04-09 20:24
结构体应该要考虑字节对齐吧??
点赞
送花
回复
分享
发布于 2021-05-07 21:56
那共用体是不是没啥用,还容易丢数据
点赞
送花
回复
分享
发布于 2022-03-03 21:35

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务