某日二师兄参加XXX科技公司的C++工程师开发岗位第11面:

面试官:在C++中,你都知道都哪些运算符?

二师兄:啥?运算符?+-*/=这些算吗?

面试官:嗯,还有其他的吗?

二师兄:当然还有,+=,-=,*=,/=,==,还有逻辑运算,位运算等。

面试官:好的。那你知道这些运算的优先级吗?

二师兄:(面试官傻逼吧,这谁记得住)记不住了,一般我都会加括号来表达我的意思。

面试官:好的。那你知道下面这段程序会输出什么吗?

#include <iostream>
int main(int argc, char const *argv[])
{
int i = 0;
std::cout << i++ + ++i << std::endl;
}

二师兄:应该是2吧。

面试官:那你知道运算符的求值顺序吗?

二师兄:应该是从左向右?

面试官:%这个符号是求余的你应该知道吧。如果使用一个int型负数对另一个int型负数求余数,结果是正数还是负数?

二师兄:应该是正数吧。

面试官:对一个整数判断是否位true或者false,可以用if(val == true)或if(val == false)吗?

二师兄:不能,因为在使用int型与bool型比较时,会把truefalse转换成int型,上面两个表达式等同于if(val == 1)和if(val == 0),与我们的本意不符。

面试官:你知道a=a+1a+=1这两者的区别吗?

二师兄:两者应该没啥区别吧?

面试官:你知道++ii++的区别吗?

二师兄:前者返回i+1,后者返回i。之后i会被+1

面试官:C++11中的左值右值你熟悉吗?

二师兄:了解过一些(我很熟悉)。

面试官:那你知道算数运算符、逻辑运算符、位运算符返回的结果是左值还是右值吗?

二师兄:额,让我想想。。。应该都是右值。

面试官:好的。那你知道点(.)和箭头(->)运算符返回的结果是左值还是右值吗?

二师兄:额。。。应该都是左值。(应该是的吧。。。)

面试官:我们都知道,一个int型的负数,在最高(31)位上的值是1。那么如果对这个负数进行右移(>>)操作,最高位上的1会被移动吗?

二师兄:应该不会。可能跟编译器实现有关。

面试官:你知道重载运算符要注意哪些事项吗?

二师兄:其实工作中很少重载运算符,我觉得最重要的事项就是尽量不要重载运算符。(我好机智。。)

面试官:好的,今天的面试结束了,回去等通知吧。

对于今日二师兄的表现,让我们来回过头看一下:

在C++中,你都知道哪些运算符?

除了算术运、逻辑、位、关系、等于运算符,如sizeofdecltypenew/delete也属于运算符。

知道下面这段程序会输出什么吗?

应该是2吧。

这里程序的输出的结果是不确定的。原因会在下面讲。

那你知道运算符的求值顺序吗?

在C++的标准中,大部分的运算符两侧的表达式的求值顺序是不确定的。在上个例子中,可能会先计算i++,然后再计算++i,也可能反过来。所以这里的结果不缺行,属于未定义的行为undefined behavior)。

那么C++中有没有确定求值顺序的二元运算符呢?答案是有的,而且仅有这四个:&&||:?,。C++标准保证这四个运算符的求值顺序是从左到右确定的。

你知道a=a+1a+=1这两者的区别吗?

此两者有一点区别,那就是前者的a会被求值2次,而后者只会被求值1次。如果开启编译器优化,有可能会被优化相同的效果。

你知道++ii++的区别吗?

除了二师兄的回答外,前置++的效率要高于后者,因为前者不需要缓存值,以用来返回。

知道点(.)和箭头(->)运算符返回的结果是左值还是右值吗?

这里箭头运算符的调用者肯定是左值(想想看为什么),但是号运算符的调用者可不一定是左值。所以箭头运算符的结果一定是左值,当点运算符的调用者是左值时,返回值时左值,当点运算符的调用者是右值时,返回值时右值。

负数进行右移(>>)操作,最高位上的1会被移动吗

很遗憾,这里回答会和不会都不对,因为这也属于未定义的行为undefined behavior)。 所以不要对有符号的类型进行按位操作,最好的情况是正好当前编译器的实现和你的预期吻合,当前平台运行无异常。一旦移植代码,可能会遇到意想不到的问题。

你知道重载运算符要注意哪些事项吗?

二师兄机智!非必要不需要重载运算符。如果一定要重载,请注意:(我还是不建议你重载运算符,回头是岸。。。下面的规则都不用看了)

  1. 重载运算符必须至少有一个操作数是用户定义的类型,这意味着不能重载内置类型的运算符。
  2. 重载运算符必须具有与原始运算符相同的优先级和关联性。
  3. 重载运算符必须具有与原始运算符相同的参数数目。例如,二元运算符必须有两个参数,一元运算符必须有一个参数。
  4. 重载运算符不能更改运算符的含义,例如,不能将“+”运算符用于减法操作。
  5. 重载运算符必须是类的成员函数或全局函数。如果是成员函数,则第一个参数必须是类的对象。
  6. 重载运算符不能更改操作数的数量或类型。例如,不能将二元运算符重载为一元运算符。
  7. 重载运算符不能具有默认参数。
  8. 重载运算符的返回类型应该是运算符执行后的结果类型。

今日份面试到这里就结束了,小伙伴们,对于今天二师兄的表现能打几分呢?如果是你,以上的问题都能回答的上来吗?

关注我,带你21天“精通”C++!(狗头)

C++面试八股文:在C++中,你知道哪些运算符?的更多相关文章

  1. 《面试八股文》之kafka21卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...

  2. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

  3. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...

  4. 面试官:Redis中字符串的内部实现方式是什么?

    在面试间里等候时,感觉这可真暖和呀,我那冰冷的出租屋还得盖两层被子才能睡着.正要把外套脱下来,我突然听到了门外的脚步声,随即门被打开,穿着干净满脸清秀的青年走了进来,一股男士香水的淡香扑面而来. 面试 ...

  5. 面试官:Redis中哈希数据类型的内部实现方式是什么?

    面试官:Redis中基本的数据类型有哪些? 我:Redis的基本数据类型有:字符串(string).哈希(hash).列表(list).集合(set).有序集合(zset). 面试官:哈希数据类型的内 ...

  6. 面试官:Redis中集合数据类型的内部实现方式是什么?

    虽然已经是阳春三月,但骑着共享单车骑了这么远,还有有点冷的.我搓了搓的被冻的麻木的手,对着前台的小姐姐说:"您好,我是来面试的."小姐姐问:"您好,您叫什么名字?&quo ...

  7. 面试官:Redis中有序集合的内部实现方式是什么?

    面试官:Redis中基本的数据类型有哪些? 我:Redis的基本数据类型有:字符串(string).哈希(hash).列表(list).集合(set).有序集合(zset). 面试官:有序集合的内部实 ...

  8. 巧用 .NET 中的「合并运算符」获得 URL 中的参数

    获取 URL 中的 GET 参数,无论用什么语言开发网站,几乎是必须会用到的代码.但获取 URL 参数经常需要注意一点就是要先判断是否有这个参数存在,如果存在则取出,如果不存在则用另一个值.这个运算称 ...

  9. maven 出现错误 -source 1.5 中不支持 diamond 运算符

    mvn clean package -DskipTests 出现如下错误: -source 1.5 中不支持 diamond 运算符 [ERROR] (请使用 -source 7 或更高版本以启用 d ...

  10. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...

随机推荐

  1. MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引

    MySQL 中的索引 前言 索引的实现 哈希索引 全文索引 B+ 树索引 索引的分类 聚簇索引(clustered index) 非聚簇索引(non-clustered index) 联合索引 覆盖索 ...

  2. pack.json中的^ ~的区别

    在版本说明前面还有个符号:'^'(插入符号)和'~'(波浪符号),他们之间的区别:例如: '~'(波浪符号):他会更新到当前minor version(也就是中间的那位数字)中最新的版本.放到我们的例 ...

  3. Apache Hudi 0.9.0版本重磅发布!更强大的流式数据湖平台

    1. 重点特性 1.1 Spark SQL支持 0.9.0 添加了对使用 Spark SQL 的 DDL/DML 的支持,朝着使所有角色(非工程师.分析师等)更容易访问和操作 Hudi 迈出了一大步. ...

  4. ARC149(A~E)

    Tasks - AtCoder Regular Contest 149 又是114514年前做的题,现在来写 屯了好多,清一下库存 A - Repdigit Number (atcoder.jp) 直 ...

  5. 中英文拼写检测纠正开源项目使用入门 word-checker 1.1.0

    项目简介 word-checker 本项目用于单词拼写检查.支持英文单词拼写检测,和中文拼写检测. 特性说明 可以迅速判断当前单词是否拼写错误 可以返回最佳匹配结果 可以返回纠正匹配列表,支持指定返回 ...

  6. 经GitHub将kubernetes镜像推送到阿里云

    背景 在安装kubernetes时会出现无法访问镜像站的情况,通过GitHub将kubernetes镜像推送到阿里云之后,即可使用阿里云地址引用所需镜像,现已同步镜像5000+,当前还在陆续同步.仓库 ...

  7. pandas之面属行统计

    描述统计学(descriptive statistics)是一门统计学领域的学科,主要研究如何取得反映客观现象的数据,并以图表形式对所搜集的数据进行处理和显示,最终对数据的规律.特征做出综合性的描述分 ...

  8. w11 U盘启动进PE看不到硬盘解决方法

    w11 U盘启动进PE看不到硬盘解决方法 今天,因为要配系统,所以需要进pe,改配置文件,进去之后发现看不到系统盘,大吃一惊,然后各种找资料,最后,还是被我搞定了. 这里以戴尔为例,方法都差不多,先看 ...

  9. .NET中使用Redis总结——2.项目实战

    接上篇.NET中使用Redis总结 -- 1.Redis搭建 看一些Redis相关资料,.NET 方面ServiceStack.Redis 用的比较多,就直接拿来用了. 在使用过程中经常过出现假死状态 ...

  10. Java 框架面试题-Spring Boot自定义配置与自动配置共存

    Spring Boot 是一个快速开发框架,可以简化 Spring 应用程序的开发,其中自定义配置是其中一个非常重要的特性. 在 Spring Boot 中,自定义配置允许开发者以自己的方式来配置应用 ...