一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推你去多家公司面试
Airbnb 数据科学职位
in analytics and inference
天天打游戏、照样领工资,
你要不要来?
把贵司招聘信息放这里
查看: 239|回复: 5
收起左侧

无人车相关c++问题

[复制链接] |试试Instant~ |关注本帖
foreverzad 发表于 2017-12-4 15:29:44 | 显示全部楼层 |阅读模式

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

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

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

x
请问哪位大神解释下这个为什么 reference 是float 或者double 输出不一样。。。面试的时候直接敲出来了,但不懂
int main(int argc, const char * argv[]) . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
{  
   double foo = 4.0;. 1point 3acres 璁哄潧
    const float& bar = foo;
    foo += 2.1234;
    cout << bar << endl;. From 1point 3acres bbs
    cout << foo << endl;
}

评分

1

查看全部评分

magicsets 发表于 2017-12-5 04:36:50 | 显示全部楼层
楼上说的已经回答了问题... 我稍微补充一点例子 鏉ユ簮涓浜.涓夊垎鍦拌鍧.

(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.   cout << "foo addr = " << &foo << "\n";
  6.   cout << "float bar addr = " << &float_bar << "\n";
  7.   cout << "double bar addr = " << &double_bar << "\n";
  8. .鏈枃鍘熷垱鑷1point3acres璁哄潧
  9.   foo += 2.1234;
  10. }. From 1point 3acres bbs
复制代码


那么输出会像这样:
  1. foo addr = 0x7ffeefbff668
  2. float bar addr = 0x7ffeefbff65c
  3. double bar addr = 0x7ffeefbff668
复制代码

.鐣欏璁哄潧-涓浜-涓夊垎鍦
也就是foo和double_bar的地址是一样的,而float_bar是另一个地址。

这涉及到C++的一个特性(不知道算不算坑,我感觉挺好用的):常量左值引用可以绑定到右值
. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
在上面的例子中,double_bar绑定的是左值引用,而float_bar由于要做implicit conversion所以绑定到了conversion后的右值——也就是一个新地址上。. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷

(2)
更多一点的关于左值右值的例子:
. Waral 鍗氬鏈夋洿澶氭枃绔,
  1. int main(int argc, const char * argv[]) {
  2.   double foo = 4.0;

  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. 1point3acres.com/bbs

  7.   double& double_lvalue_bar = foo;                          // OK
  8.   const double& const_double_lvalue_bar = foo;              // OK
  9.   // double&& double_rvalue_bar = foo;                      // 编译错误
  10.   double&& double_rvalue_bar = std::move(foo);              // 编译错误
  11.   // const double&& const_double_rvalue_bar = foo;          // 编译错误
  12.   const double&& const_double_rvalue_bar = std::move(foo);  // OK

  13.   foo += 2.1234;
  14. . 1point 3acres 璁哄潧
  15.   cout << "const_float_lvalue_bar = " << const_float_lvalue_bar << endl;
  16.   cout << "float_rvalue_bar = " << float_rvalue_bar << endl;
  17.   cout << "const_float_rvalue_bar = " << const_float_rvalue_bar << endl; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  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;
  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
复制代码
. From 1point 3acres bbs
补充内容 (2017-12-5 04:39):
注释掉的代码才是编译错误,有一行笔误没注释但标注了编译错误... 应该是标注OK
回复 支持 2 反对 0

使用道具 举报

helloterran 发表于 2017-12-4 15:48:52 | 显示全部楼层
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). From 1point 3acres bbs

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

使用道具 举报

davidpy 发表于 2017-12-5 04:59:17 | 显示全部楼层
请问这是zoox的店面题吗,lz又后续吗
回复 支持 反对

使用道具 举报

 楼主| foreverzad 发表于 2017-12-5 05:20:50 | 显示全部楼层
davidpy 发表于 2017-12-5 04:59
请问这是zoox的店面题吗,lz又后续吗

不是,我已经挂了.
回复 支持 反对

使用道具 举报

 楼主| foreverzad 发表于 2017-12-5 05:23:13 | 显示全部楼层
谢谢大神们的讲解和例子~~总算看懂了
回复 支持 反对

使用道具 举报

本版积分规则

关闭

一亩三分地推荐上一条 /5 下一条

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

custom counter

GMT+8, 2017-12-16 01:46

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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