牛客模拟面试-05

表与表之间是怎么关联的

表与表之间常用的关联方式有两种:内连接、外连接。

内连接:

内连接通过INNER JOIN来实现,它将返回两张表中满足连接条件的数据,不满足条件的数据不会查询出来。

外连接:

外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的数据。外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

左外连接:可以简称为左连接(LEFT JOIN),返回左表中的所有记录和右表中满足连接条件的记录。 右外连接:可以简称为右连接(RIGHT JOIN),返回右表中的所有记录和左表中满足连接条件的记录。 ​ 除此之外,还有一种常见的连接方式:等值连接。这种连接是通过WHERE子句中的条件,将两张表连接在一起,它的实际效果等同于内连接。出于语义清晰的考虑,一般更建议使用内连接,而不是等值连接。

加分回答

​ 以上是从语法上来说明表与表之间关联的实现方式,而从表的关系上来说,比较常见的关联关系有:一对多关联、多对多关联、自关联。

一对多关联:这种关联形式最为常见,一般是两张表具有主从关系,并且以主表的主键关联从表的外键来实现这种关联关系。另外,以从表的角度来看,它们是具有多对一关系的,所以不再赘述多对一关联了。 多对多关联:这种关联关系比较复杂,如果两张表具有多对多的关系,那么它们之间需要有一张中间表来作为衔接,以实现这种关联关系。这个中间表要设计两列,分别存储那两张表的主键。因此,这两张表中的任何一方,都与中间表形成了一对多关系,从而在这个中间表上建立起了多对多关系。 自关联:自关联就是一张表自己与自己相关联,为了避免表名的冲突,需要在关联时通过别名将它们当做两张表来看待。一般在表中数据具有层级(树状)时,可以采用自关联一次性查询出多层级的数据。

简述一下C++ 从代码到可执行二进制文件的过程

【得分点】

预编译、编译、汇编、链接

【参考答案】

标准回答

C++ 从代码到可执行二进制文件经过四个过程,分别是:预编译、编译、汇编、链接。

  1. 预编译,主要的处理操作:

a.将所有的 #define 删除,并且展开所有的宏定义(宏替换)

b.处理所有的条件预编译指令,如 #if、#ifdef

c.处理 #include 预编译指令,将被包含的文件插入到该预编译指令的位置

d.删除所有的注释

e. 添加行号和文件名标识

  1. 编译:将预处理之后的代码转换成特定的汇编代码,主要包括词法分析、语法分析、语义分析、优化代码等操作

  2. 汇编:将汇编代码汇编成机器指令

  3. 链接:将不同源文件生成的目标代码以及其它目标代码、库文件组合起来,从而形成可执行程序

加分回答

链接分为静态链接和动态链接。

  1. 静态链接:静态链接是由链接器在链接时将库的内容加入到可执行程序中,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。

  2. 动态链接:动态链接在链接后动态库仍然与可执行文件分离,直到运行时才动态加载。

alt

  1. 预处理 gcc -E test.c -o test.i

  2. 编译 gcc -S test.i -o test.s

  3. 汇编 gcc -c test.s -o test.o

  4. 链接 gcc test.o -o test

生成可执行程序过程为成四个步骤:

1、由.c文件到.i文件,这个过程叫预处理。 2、由.i文件到.s文件,这个过程叫编译。 3、由.s文件到.o文件,这个过程叫汇编。 4、由.o文件到可执行文件,这个过程叫链接。

简述一下C++ 中的四种类型转换

【得分点】

static_cast、dynamic_cast、const_cast、reinterpret_cast

【参考答案】

标准回答

使用C 风格的类型转换可以把想要的任何东西转换成我们需要的类型,但是这种类型转换太过松散,对于这种松散的情况,C++ 提供了更严格的类型转换,可以提供更好的控制转换过程,并添加 4 个类型转换运算符,使转换过程更规范:static_cast、dynamic_cast、const_cast、reinterpret_cast。

  1. static_cast 静态转换

用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换

o 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的

o 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的

用于基本数据类型之间的转换,如把int 转换成 char,把 char 转换成 int。这种转换的安全性也要开发人员来保证

  1. dynamic_cast 动态转换

dynamic_cast 主要用于类层次间的上行转换和下行转换

在类层次间进行上行转换时,dynamic_cast 和 static_cast 的效果是一样的

在进行下行转换时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全

  1. const_cast 常量转换

该运算符用来修改类型的const属性

常量指针被转化成非常量指针,并且仍然指向原来的对象

常量引用被转换成非常量引用,并且仍然指向原来的对象

注意:不能直接对非指针和非引用的变量使用 const_cast 操作符

  1. reinterpret_cast 重新解释转换

这是最不安全的一种转换机制,最有可能出问题

主要用于将一种数据类型从一种类型转换为另一种类型,它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针

比较版本号

全部评论

相关推荐

完了_我学不完了:老哥啥时候进的评估呀俺是云三
点赞 评论 收藏
分享
01-28 16:12
中南大学 Java
几年前还没有chatgpt的时候,刷题真的是很痛苦。刷不出来只能看题解,题解有几个问题:第一个是每次看的写题解的人都不一样,很难有一个统一的思路;第二个也是最重要的是,题解只提供了作者自己的思路,但是没有办法告诉你你的思路哪里错了。其实很少有错误的思路,我只是需要被引导到正确的思路上面去。所以传统题解学习起来非常困难,每次做不出来难受,找题解更难受。但是现在chatgpt能做很多!它可以这样帮助你 -1. 可以直接按照你喜欢的语言生成各种解法的题解和分析复杂度。2. 把题和你写的代码都发给它,它可以告诉你 你的思路到底哪里有问题。有时候我发现我和题解非常接近,只是有一点点🤏想错了。只要改这一点点就是最优解。信心倍增。3. 如果遇到不懂的题解可以一行一行询问为什么要这样写,chatgpt不会嫌你烦。有时候我觉得自己的range写错了,其实那样写也没错,只是chat老师的题解有一点优化,这个它都会讲清楚。4. 它可以帮你找可以用同类型解法来做的题。然后它可以保持解法思路不变,用一个思路爽刷一个类型的题。如果题目之间思路又有变化,它会告诉你只有哪里变了,其他的地方还是老思路。5. 它也可以直接帮你总结模板,易错点。经过chat老师的指导,我最大的改变是敢刷题了。之前刷题需要先找某一个人写的算法题repo,然后跟着某一个人他的思路刷他给的几个题。如果想写别的题,套用思路失败了,没有他的题解,也不知道到底哪里错了;看别人的题解,思路又乱了。这个问题在二分查找和dp类型的题里面特别常见。但是现在有chat老师,他会针对我的代码告诉我我哪里想错了,应该怎么做;还按照我写代码的习惯帮我总结了一套属于我的刷题模板。每天写题全是正反馈!
明天不下雨了:那我建议可以用 chatgpt atlas 或者 dia 去刷,也可以用 chrome 加个 ai 插件去刷 左边刷题右边 chat 效果很好
AI时代的工作 VS 传...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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