gpt4 book ai didi

c++ - C/C++ 中的显式转换

转载 作者:太空狗 更新时间:2023-10-29 15:28:06 27 4
gpt4 key购买 nike

在阅读了几篇有关该主题的 SO 帖子后,我仍然感到困惑,主要是关于整数和 bool 变量/表达式。

A.整数表达式

假设我想在浮点计算中使用模表达式,如果有的话,下列哪项是最正确的? C和C++之间有什么区别吗?还是我应该相信编译器会做出正确的转换?

double sign;
int num = rand() % 100;
//want to map odd num to -1.0 and even num to 1.0
//A
sign = -2 * (num % 2) + 1;
//B
sign = -2.0 * (num % 2) + 1;
//C
sign = -2.0 * (num % 2) + 1.0;
//D
sign = -2 * (num % 2) + 1.0;
//E
sign = -2 * (double)(num % 2) + 1;
//F
sign = -2.0 * (double)(num % 2) + 1;
//G
sign = -2.0 * (double)(num % 2) + 1.0;
//H
sign = -2 * (double)(num % 2) + 1.0;

B. bool 表达式

我可以安全地使用 bool 表达式作为 float /整数计算中的元素而无需显式转换吗? C 和 C++ 之间有区别吗?

double d_res = 1.0;
int i_res = 1;
int num = rand() % 10;
d_res = d_res + (num > 5);//or d_res = d_res + (double)(num > 5)?
i_res += (num > 5);//or i_res += (int)(num > 5)?

最佳答案

A.初始化

double sign = -2 * (num % 2) + 1;

的定义非常明确。那就是我要用的;我认为没有必要通过额外的转换或其他任何方式使事情复杂化。

C 和 C++ 在整数和浮点类型之间的隐式转换方面定义明确且方便。通常不需要显式转换。根据我的经验,只有三件事需要担心:

  • double ratio = 1/3 这样的代码并没有达到您的要求;您需要强制 / 的操作数之一为 float 。 (这与您的问题无关,但这是一个非常容易犯的错误。)
  • 溢出,如果一种类型或另一种类型不能表示该值。 (对于您的示例也不是问题。)
  • 狂热的编译器。许多编译器会“有帮助地”警告您在从 double 转换为 float 或从浮点类型转换为整数时可能会丢失精度。因此,您可能需要显式强制转换来消除这些警告。

B. 要求 bool 值的数值是完全明确定义的(保证给你一个漂亮、干净的 1 或 0),所以你的第二个片段也应该没问题。 (我知道这对 C 来说是正确的,根据下面的评论,这对 C++ 也是正确的。)

关于c++ - C/C++ 中的显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431309/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com