【问题标题】:Typecasting in C and use of parenthesesC中的类型转换和括号的使用
【发布时间】:2016-05-13 11:14:50
【问题描述】:

我有这些变量

distance = 945
speed = 614

我想以小时和分钟为单位获取时间,因此我将距离/速度相除以获得小时数。现在,如果我想将分钟作为整数,我有以下代码:

int minutes;
minutes = (float) (distance%speed) / speed * 60;

这个表达式给出了 32 分钟的值,但是,当我第一次尝试时,我想让代码更“可读”,我尝试了以下选项,结果为 0:

minutes = (float)  ( (distance%speed) / speed * 60 );
minutes = (float) ( (distance%speed) / speed  ) * 60;

请注意,括号是添加的并且位于不同的位置,所以为什么在我看来很好的地方使用括号会干扰计算并在变量中设置 0 的值。我想这与类型转换过程有关,但括号位于应该使表达式更清晰的位置。

我有正确的答案并且程序可以正常运行,但我想在以后的场合中理解这一点,因为我花了一点时间玩括号。谢谢

【问题讨论】:

  • 为了使代码更具可读性,可以考虑添加注释来指定距离和速度的单位,或者更改变量名:distance_metres、speed_metres_per_sec等。
  • 您为什么希望演员表遵循分配规律?是1 / (2 + 3) == 1 / 2 + 3?无论哪种方式,该代码都没有多大意义。你的编译器应该抱怨。阅读 C 信息页面以获得一些非常有用的建议。并提供minimal reproducible example
  • @Chritian - Kingsley 的评论(添加单位)实际上非常好,无论您的实际变量名称如何。
  • 在 C++ 中有更好的解决方案使用Boost.Units
  • 除非真的需要,否则不要使用float。一般首选double

标签: c casting parentheses


【解决方案1】:

那么为什么在我觉得很好的地方使用括号会干扰计算并在变量中设置 0 的值。

这是因为额外的括号 () 使您在第二个语句中对 float 的转换无效。

  • 在您的第一个声明中:

minutes = (float) (distance%speed) / speed * 60;

这里首先评估(float) (distance%speed)

  • 但在您的第二个陈述中:

(float) ( (distance%speed) / speed * 60 );

您的额外() 导致(distance%speed) / speed * 60 首先被评估,因此演员(float) 变得无关紧要。

我想让代码更“可读”

与“可读性”相关,虽然在这里添加更多括号肯定没有帮助,但 Kingsley 的建议(添加单位)是一个好方法。例如,

int distance_m = 945;
int speed_kph = 614;

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2020-11-17
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2012-11-02
    相关资源
    最近更新 更多