首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C/C++中的显式铸造

C/C++中的显式铸造
EN

Stack Overflow用户
提问于 2019-10-17 11:14:31
回答 1查看 221关注 0票数 4

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

A.整数表达式

假设我想在浮点计算中使用模表达式,如果有的话,以下最正确的是什么?C和C++之间有什么区别吗?或者我应该信任编译器进行正确的转换吗?

代码语言:javascript
运行
复制
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++有什么区别吗?

代码语言:javascript
运行
复制
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)?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-17 11:23:58

A.初始化

代码语言:javascript
运行
复制
double sign = -2 * (num % 2) + 1;

定义得很清楚。这就是我所使用的;我不认为有任何必要用额外的转换或任何东西来使事情复杂化。

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

  • 代码(如double ratio = 1 / 3 )并不能满足您的要求;您需要强制其中一个操作数为/浮点。(这与您的问题无关,但如果一种类型或另一种类型不能表示值,则对make.)
  • Overflow,来说是一个极其容易的错误。( example.)
  • Overzealous编译器也不存在问题。许多编译器将“有益地”警告您,在从double转换为float或从浮点类型转换为整数时,可能会丢失精度。因此,您可能需要显式的强制转换来压制这些警告。

B.请求布尔值的数值是完全定义的(保证给您一个很好的、干净的、1或0),所以您的第二个片段也应该很好。(我知道C是这样的,根据下面的注释,C++也是如此。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58431309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档