阅读了有关该主题的几篇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)?
A。表达式
sign = -2 * (num % 2) + 1;
定义明确。那就是我要用的;我认为没有必要通过额外的强制转换或其他方式使事情复杂化。
C和C ++在整数和浮点类型之间的隐式转换中定义明确且方便。根据我的经验,只需要担心三件事,这都不适用:
double ratio = 1 / 3
之类的代码无法完成您想要的;您需要将其中一个操作数强制为/
为浮点数。 (这与您的问题无关,但这是一个非常容易犯的错误。)double
转换为float
或从浮点类型转换为整数时,可能会失去精度。因此,您可能需要显式强制转换才能使这些警告静音。B。要求布尔值是在C语言中定义明确的,因此您的第二个片段也应该很好。 C ++中可能还有一些其他问题。我不确定。