【问题标题】:Arithmetic operators and function calling in CC中的算术运算符和函数调用
【发布时间】:2011-02-23 23:20:15
【问题描述】:

我不太清楚为什么我不能这样做

double a = (double) my_Function(45) / 2048 / 2340 / 90;
printf("%.4f",a); // prints out 0.00

但我必须使用另外一个变量:

double a = (double) my_Function(45);
double b = a  / 2048 / 2340 / 90;
printf("%.4f",b);  // prints out the correct value

【问题讨论】:

  • 为什么要投射到float 而不是double?而第二个答案中的第二个演员什么也不做。
  • 我可以问你为什么要对这些看似神奇的数字 2048、2340 和 90 进行硬编码吗?也许你可以#define MAGIC (2048 * 2340 * 90)const int MAGIC = 2048 * 2340 * 90((double) my_Function(45)) / MAGIC 来简化未来的事情。或者,如果它们应该是单独的常量,您仍然可以使用该技术为它们命名,以帮助其他人理解代码在做什么。
  • 这两个代码块应该产生相同的结果(“正确”值)。您确定在此处复制代码没有出错吗?
  • 在几乎所有情况下,两个版本的代码都会产生完全相同的结果。要么你的编译器坏了,要么(更有可能)你对问题的描述不准确(假代码)。
  • @Chris Lutz:感谢您的建议!

标签: c operators math


【解决方案1】:

my_Function 返回什么?也许你的答案小于 10^(-4)。

【讨论】:

  • 其实是操作顺序的问题,不过还是谢谢!
  • @Robert Dalton:在你的两种情况下,顺序是相同的,所以不,这不是操作顺序的问题。
  • @Robert:我在自己的测试程序中运行了您的代码。操作顺序无关紧要。如果答案太小(
  • @Robert:尝试使用 printf("%g",a) 来确认
【解决方案2】:

归结为操作顺序。

你基本上是在第一行这样做

double a = (double)(my_Function(45) / 2048 / 2340 / 90);

【讨论】:

  • +1 但您可能应该提及更正的版本:((double)my_Function(45)) / 2048 / 2340 / 90
  • 类型转换的优先级高于任何算术运算符。
  • @Daniel A. White:不正确。 Cast 的优先级高于除法。
  • @Matt:不,我的意思是更高的优先级。 @Daniel:看看名单;演员表显然比除法具有更高的优先级。因此,在(double) my_Function(45) / 2048 中,强制转换应用于my_Function(45) 的结果,然后计算除法,这是所需的行为。
  • @AndreyT:因为我不能对这些 cmets 中的任何一个投票,所以我认为让整个对话“接受”是个好主意。
猜你喜欢
  • 2013-02-06
  • 2012-10-10
  • 2021-06-23
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
相关资源
最近更新 更多