乐趣区

关于c++:C面试八股文在C中你知道哪些运算符

某日二师兄加入 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++!(狗头)

退出移动版