一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推多家公司面试
游戏初创公司
招聘工程师、Designer和游戏策划
游戏初创公司DreamCraft招聘工程师、UIUX Designer和游戏策划
把贵司招聘信息放这里
查看: 432|回复: 5
收起左侧

无人车相关c++问题

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

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

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

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

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

评分

1

查看全部评分

magicsets 发表于 2017-12-5 04:36:50 | 显示全部楼层
楼上说的已经回答了问题... 我稍微补充一点例子

(1) 考虑这么一个程序:
  1. int main(int argc, const char * argv[]) {. 鍥磋鎴戜滑@1point 3 acres
  2.   double foo = 4.0;. more info on 1point3acres.com
  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.   foo += 2.1234;
  9. }
复制代码


那么输出会像这样:
  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)
更多一点的关于左值右值的例子:

  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 鏉ユ簮涓浜.涓夊垎鍦拌鍧.

  7.   double& double_lvalue_bar = foo;                          // OK. from: 1point3acres.com/bbs
  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.   cout << "const_float_lvalue_bar = " << const_float_lvalue_bar << endl;
  15.   cout << "float_rvalue_bar = " << float_rvalue_bar << endl;
  16.   cout << "const_float_rvalue_bar = " << const_float_rvalue_bar << endl;
  17.   cout << endl;
  18. . visit 1point3acres.com for more.
  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. double_lvalue_bar = 6.1234
  5. const_double_lvalue_bar = 6.1234
  6. double_rvalue_bar = 6.1234. 鍥磋鎴戜滑@1point 3 acres
  7. const_double_rvalue_bar = 6.1234
复制代码

补充内容 (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)

你的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, 2018-2-23 06:56

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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