C / C ++中的显式转换

问题描述 投票:1回答:1

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

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。布尔表达式

我是否可以在不进行显式强制转换的情况下,将布尔表达式安全地用作浮动/整数计算中的元素? 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)?
c++ c casting
1个回答
1
投票

A。表达式

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

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

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

  • double ratio = 1 / 3之类的代码无法完成您想要的;您需要将其中一个操作数强制为/为浮点数。 (这与您的问题无关,但这是一个非常容易犯的错误。)
  • 溢出,如果一种或另一种不能表示该值。 (对于您的示例,这也不是问题。)
  • 过度的编译器。许多编译器会“有帮助”地警告您,将double转换为float或从浮点类型转换为整数时,可能会失去精度。因此,您可能需要显式强制转换才能使这些警告静音。

B。要求布尔值是在C语言中定义明确的,因此您的第二个片段也应该很好。 C ++中可能还有一些其他问题。我不确定。

© www.soinside.com 2019 - 2024. All rights reserved.