Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显式/隐式类型转换c++;_C++_Implicit Conversion_Explicit Conversion - Fatal编程技术网

C++ 显式/隐式类型转换c++;

C++ 显式/隐式类型转换c++;,c++,implicit-conversion,explicit-conversion,C++,Implicit Conversion,Explicit Conversion,我有一行代码 double i = 1 + (long)1.5* 5.0f 我的问题是转换顺序和结果是什么?我一直在寻找这样的例子,但没有结果。有什么好的指南可以帮助我理解它吗?应该告诉你你需要知道的一切 铸造:1.5铸造为long 乘法:1.5*5.0f,它将此产品强制转换为浮点 添加:1+((长)1.5)*5.0f) 分配:i=1+((长)1.5*5.0f) 从中可以看出,强制转换运算符的优先级高于乘法,但请按照建议使用括号 我的问题是转换顺序和结果是什么 强制转换应用于1.5,给出一个值

我有一行代码

double i = 1 + (long)1.5* 5.0f
我的问题是转换顺序和结果是什么?我一直在寻找这样的例子,但没有结果。有什么好的指南可以帮助我理解它吗?

应该告诉你你需要知道的一切

  • 铸造:
    1.5
    铸造为
    long
  • 乘法:
    1.5*5.0f
    ,它将此产品强制转换为
    浮点
  • 添加:
    1+((长)1.5)*5.0f)
  • 分配:
    i=1+((长)1.5*5.0f)
  • 从中可以看出,强制转换运算符的优先级高于乘法,但请按照建议使用括号

    我的问题是转换顺序和结果是什么

    强制转换应用于
    1.5
    ,给出一个值为
    1
    long

    将其转换为
    float
    5.0f
    相乘,得到一个
    float
    5.0f

    1
    转换为
    float
    与该值相加,得到一个
    float
    6.0f

    最后,它被提升为
    double
    (保留
    6.0
    )以分配给
    i

    这假设一个非疯狂的浮点格式,可以精确地表示小整数;否则,可能存在舍入误差

    如果要强制转换乘法结果,请使用括号控制运算符优先级:

    double i = 1 + (long)(1.5* 5.0f);  // = 8.0
    
    或者使用C++样式的强制转换,强制使用括号:

    double i = 1 + static_cast<long>(1.5* 5.0f)
    
    double i=1+静态施法(1.5*5.0f)
    
    有什么好的指南可以帮助我理解它吗


    这里有一个:。请注意,类型转换的优先级高于乘法,而乘法又高于加法(3对5对6)。

    如果您不确定转换运算符的优先级,请重写表达式(在您的头脑中)


    这里很明显什么具有优先权,与第一个版本相同

    如果您不确定,请在代码中加括号。((长)(1.5*5.0f))你在谈论优先表吗?@MartinPerry-如果你不确定,做一些研究。盲目添加括号通常会造成无法阅读的混乱。或者,在这种情况下,使用一种新的样式转换:
    static_cast(1.5*5.0f)
    似乎是一个很好的候选。转换为long意味着乘法是
    1L*5.0f
    “1被提升为浮点”。这里的“晋升”一词正确吗?我认为它应该被“转换”。@Nawaz:是的,你说得对。我永远记不清哪个是哪个。@MikeSeymour真的很重要吗?(值得一提的是:即使两个操作数具有相同的类型,也会发生提升。其他所有事情都是转换。此外,我认为唯一一次浮点提升是作为匹配
    )的函数参数进行的。@JamesKanze:不,这不重要,但是这里有足够多的书呆子,我宁愿把事情做好。@JamesKanze:这在这里并不重要。但我正在努力适应规范使用的术语,这样当我看规范/提案/草案时,我可能会觉得它是可以理解的。在我的第一次评论中,我只是想确认我对事情的理解是正确的。:-)
    (long)1.5 * 5.0
    
    5.0 * (long)1.5