某日二师兄参加XXX科技公司的C++工程师开发岗位第11面:
面试官:在C++中,你都知道都哪些运算符?
二师兄:啥?运算符?+-*/=这些算吗?
面试官:嗯,还有其他的吗?
二师兄:当然还有,+=,-=,*=,/=,==,还有逻辑运算,位运算等。
面试官:好的。那你知道这些运算的优先级吗?
二师兄:(面试官傻逼吧,这谁记得住)记不住了,一般我都会加括号来表达我的意思。
面试官:好的。那你知道下面这段程序会输出什么吗?
[code]#include int main(int argc, char const *argv[]){ int i = 0; std::cout >)操作,最高位上的1会被移动吗?</p>二师兄:应该不会。可能跟编译器实现有关。
面试官:你知道重载运算符要注意哪些事项吗?
二师兄:其实工作中很少重载运算符,我觉得最重要的事项就是尽量不要重载运算符。(我好机智。。)
面试官:好的,今天的面试结束了,回去等通知吧。
</blockquote>对于今日二师兄的表现,让我们来回过头看一下:
在C++中,你都知道哪些运算符?
除了算术运、逻辑、位、关系、等于运算符,如sizeof,decltype、new/delete也属于运算符。
知道下面这段程序会输出什么吗?
应该是2吧。
这里程序的输出的结果是不确定的。原因会在下面讲。
那你知道运算符的求值顺序吗?
在C++的标准中,大部分的运算符两侧的表达式的求值顺序是不确定的。在上个例子中,可能会先计算i++,然后再计算++i,也可能反过来。所以这里的结果不缺行,属于未定义的行为(undefined behavior)。
那么C++中有没有确定求值顺序的二元运算符呢?答案是有的,而且仅有这四个:&&,||,:?,,。C++标准保证这四个运算符的求值顺序是从左到右确定的。
你知道a=a+1和a+=1这两者的区别吗?
此两者有一点区别,那就是前者的a会被求值2次,而后者只会被求值1次。如果开启编译器优化,有可能会被优化相同的效果。
你知道++i和i++的区别吗?
除了二师兄的回答外,前置++的效率要高于后者,因为前者不需要缓存值,以用来返回。
知道点(.)和箭头(->)运算符返回的结果是左值还是右值吗?
这里箭头运算符的调用者肯定是左值(想想看为什么),但是号运算符的调用者可不一定是左值。所以箭头运算符的结果一定是左值,当点运算符的调用者是左值时,返回值时左值,当点运算符的调用者是右值时,返回值时右值。
负数进行右移(>>)操作,最高位上的1会被移动吗
很遗憾,这里回答会和不会都不对,因为这也属于未定义的行为(undefined behavior)。 所以不要对有符号的类型进行按位操作,最好的情况是正好当前编译器的实现和你的预期吻合,当前平台运行无异常。一旦移植代码,可能会遇到意想不到的问题。
你知道重载运算符要注意哪些事项吗?
二师兄机智!非必要不需要重载运算符。如果一定要重载,请注意:(我还是不建议你重载运算符,回头是岸。。。下面的规则都不用看了)
- 重载运算符必须至少有一个操作数是用户定义的类型,这意味着不能重载内置类型的运算符。
- 重载运算符必须具有与原始运算符相同的优先级和关联性。
- 重载运算符必须具有与原始运算符相同的参数数目。例如,二元运算符必须有两个参数,一元运算符必须有一个参数。
- 重载运算符不能更改运算符的含义,例如,不能将“+”运算符用于减法操作。
- 重载运算符必须是类的成员函数或全局函数。如果是成员函数,则第一个参数必须是类的对象。
- 重载运算符不能更改操作数的数量或类型。例如,不能将二元运算符重载为一元运算符。
- 重载运算符不能具有默认参数。
- 重载运算符的返回类型应该是运算符执行后的结果类型。
今日份面试到这里就结束了,小伙伴们,对于今天二师兄的表现能打几分呢?如果是你,以上的问题都能回答的上来吗?
关注我,带你21天“精通”C++!(狗头)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |