我就好奇了,你们怎么做到谈恋爱+工作&学习两不误

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投
内推多家公司面试
坐标湾区
DreamCraft创始团队
招聘游戏开发工程师
游戏初创公司招聘工程师、UIUX Designer和游戏策划
高效直聘+内推,70%面试率
AI帮你免费完善简历
直击全美十万个科技职位
把贵司招聘信息放这里
查看: 1111|回复: 5
收起左侧

无人车相关c++问题

[复制链接] |试试Instant~
我的人缘0
foreverzad 发表于 2017-12-4 15:29:44 | 显示全部楼层 |阅读模式
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  91% (11)
 
 
8% (1)  踩

2017(10-12月) 码农类General 博士 全职@无人车相关 - 网上海投 - 技术电面  | Other | 在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

x
请问哪位大神解释下这个为什么 reference 是float 或者double 输出不一样。。。面试的时候直接敲出来了,但不懂
int main(int argc, const char * argv[])
{  
   double foo = 4.0;
    const float& bar = foo;
    foo += 2.1234;
    cout << bar << endl;
    cout << foo << endl; 来源一亩.三分地论坛.
}

评分

参与人数 1大米 +1 收起 理由
Pony_s + 1 给你点个赞!

查看全部评分


上一篇:领英昂赛
下一篇:领英电面
我的人缘0
magicsets 发表于 2017-12-5 04:36:50 | 显示全部楼层
本楼: 【顶】   100% (2)
 
 
0% (0)   【踩】
全局: 顶  97% (287)
 
 
2% (6)  踩
楼上说的已经回答了问题... 我稍微补充一点例子
-google 1point3acres
(1) 考虑这么一个程序:
  1. int main(int argc, const char * argv[]) {. 一亩-三分-地,独家发布
  2.   double foo = 4.0;
  3.   const float& float_bar = foo;
  4.   const double& double_bar = foo;
  5. .本文原创自1point3acres论坛
  6.   cout << "foo addr = " << &foo << "\n";
  7.   cout << "float bar addr = " << &float_bar << "\n"; 来源一亩.三分地论坛.
  8.   cout << "double bar addr = " << &double_bar << "\n";.1point3acres网

  9.   foo += 2.1234;
  10. }
复制代码


那么输出会像这样:
  1. foo addr = 0x7ffeefbff668.留学论坛-一亩-三分地
  2. float bar addr = 0x7ffeefbff65c
  3. double bar addr = 0x7ffeefbff668
复制代码


也就是foo和double_bar的地址是一样的,而float_bar是另一个地址。

这涉及到C++的一个特性(不知道算不算坑,我感觉挺好用的):常量左值引用可以绑定到右值.1point3acres网

在上面的例子中,double_bar绑定的是左值引用,而float_bar由于要做implicit conversion所以绑定到了conversion后的右值——也就是一个新地址上。

(2)
更多一点的关于左值右值的例子:

  1. int main(int argc, const char * argv[]) {. more info on 1point3acres
  2.   double foo = 4.0;. 1point 3acres 论坛

  3.   // float& float_lvalue_bar = foo;                         // 编译错误
  4.   const float& const_float_lvalue_bar = foo;                // OK
  5.   float&& float_rvalue_bar = foo;                           // OK
  6.   const float&& const_float_rvalue_bar = foo;               // OK
  7. . more info on 1point3acres
  8.   double& double_lvalue_bar = foo;                          // OK. 牛人云集,一亩三分地
  9.   const double& const_double_lvalue_bar = foo;              // OK
  10.   // double&& double_rvalue_bar = foo;                      // 编译错误
  11.   double&& double_rvalue_bar = std::move(foo);              // 编译错误. from: 1point3acres
  12.   // const double&& const_double_rvalue_bar = foo;          // 编译错误
  13.   const double&& const_double_rvalue_bar = std::move(foo);  // OK

  14.   foo += 2.1234;

  15.   cout << "const_float_lvalue_bar = " << const_float_lvalue_bar << endl;-google 1point3acres
  16.   cout << "float_rvalue_bar = " << float_rvalue_bar << endl;
  17.   cout << "const_float_rvalue_bar = " << const_float_rvalue_bar << endl;. 1point 3acres 论坛
  18.   cout << endl;

  19.   cout << "double_lvalue_bar = " << double_lvalue_bar << endl;
  20.   cout << "const_double_lvalue_bar = " << const_double_lvalue_bar << endl;
  21.   cout << "double_rvalue_bar = " << double_rvalue_bar << endl;
  22.   cout << "const_double_rvalue_bar = " << const_double_rvalue_bar << endl;. more info on 1point3acres
  23. }
复制代码


输出:
  1. const_float_lvalue_bar = 4
  2. float_rvalue_bar = 4
  3. const_float_rvalue_bar = 4
  4. . 牛人云集,一亩三分地
  5. double_lvalue_bar = 6.1234
  6. const_double_lvalue_bar = 6.1234
  7. double_rvalue_bar = 6.1234
  8. const_double_rvalue_bar = 6.1234
复制代码

补充内容 (2017-12-5 04:39):
注释掉的代码才是编译错误,有一行笔误没注释但标注了编译错误... 应该是标注OK
回复

使用道具 举报

我的人缘0
helloterran 发表于 2017-12-4 15:48:52 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  92% (52)
 
 
7% (4)  踩
http://en.cppreference.com/w/cpp/language/reference_initialization

If object is an lvalue expression, and its type is implicitly convertible to a type that is either T or derived from T, equally or less cv-qualified, then the non-explicit conversion functions of the source type and its base classes that return lvalue references are considered and the best one is selected by overload resolution. The reference is then bound to the object identified by the lvalue returned by the conversion function (or to its base class subobject)

你的bar和foo不是一个type,所以bar绑定给了double->float implicit conversion生成的float 右值。也所以bar必须是const
回复

使用道具 举报

我的人缘0
davidpy 发表于 2017-12-5 04:59:17 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  94% (17)
 
 
5% (1)  踩
请问这是zoox的店面题吗,lz又后续吗
回复

使用道具 举报

我的人缘0
 楼主| foreverzad 发表于 2017-12-5 05:20:50 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  91% (11)
 
 
8% (1)  踩
davidpy 发表于 2017-12-5 04:59
请问这是zoox的店面题吗,lz又后续吗

不是,我已经挂了.
回复

使用道具 举报

我的人缘0
 楼主| foreverzad 发表于 2017-12-5 05:23:13 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  91% (11)
 
 
8% (1)  踩
谢谢大神们的讲解和例子~~总算看懂了
回复

使用道具 举报

游客
请先登录

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版|小黑屋|一亩三分地论坛声明

GMT+8, 2018-10-16 05:11

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表