在阅读了关于该主题的几篇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)
A.初始化
double sign = -2 * (num % 2) + 1;
Run Code Online (Sandbox Code Playgroud)
定义明确。那就是我要用的;我认为没有必要通过额外的强制转换或其他方式使事情复杂化。
C和C ++在整数和浮点类型之间的隐式转换中定义明确且方便。通常不需要显式转换。根据我的经验,只需要担心三件事:
double ratio = 1 / 3无法满足您的要求。您需要强制其中一个操作数为/浮点数。(这与您的问题无关,但这是一个非常容易犯的错误。)double为float,或从浮点类型转换为整数时,您可能会失去精度。因此,您可能需要显式强制转换以使这些警告静音。B.要求布尔值是完美定义的(保证给您一个漂亮的,干净的1或0),因此您的第二个片段也应该很好。(我知道这对于C是正确的,并且根据下面的注释,对于C ++也是如此。)
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |