C / C ++中的显式转换

Ben*_*y K 4 c c++ casting

在阅读了关于该主题的几篇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;
Run Code Online (Sandbox Code Playgroud)

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)?
Run Code Online (Sandbox Code Playgroud)

Ste*_*mit 6

A.初始化

double sign = -2 * (num % 2) + 1;
Run Code Online (Sandbox Code Playgroud)

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

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

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

B.要求布尔值是完美定义的(保证给您一个漂亮的,干净的1或0),因此您的第二个片段也应该很好。(我知道这对于C是正确的,并且根据下面的注释,对于C ++也是如此。)

  • 对于C ++,没有其他问题:http://eel.is/c++draft/conv.fpint#2(对于[积分情况](http://eel.is/c++draft/conv。积分2))。 (2认同)