在C中正确使用常量

时间:2018-12-20 16:13:54

标签: c

我刚刚在代码中发现了一个错误,可以将其简化为:

float c;
int a,b;
a=5;b=6;
c=(a+b)/2;

在调试中,c的值为5,即执行了整数除法。

这引出我一个问题:使用未存储在变量(即常量)中的数字时,什么是良好的做法?就我而言,分母2。

当我实现带有各种常量的数学公式时,是否应该始终最后放置.0以确保其在内部用作double?它会加快我的程序的运行时间吗?如果必须将常量从int转换为double,需要做多少额外的工作?

像公式

z = 180 * 3.1415 * x  + 5*y^2 - (10*x-y)/(y+x);

其中xyz是双打。

所以我的问题是

在所有因子的末尾加上.0是“干净的代码”吗?确实会大大降低代码的可读性,尤其是在公式很长的情况下。但是按照这种约定,我可以防止出现像开头所述的错误。

4 个答案:

答案 0 :(得分:5)

常量在编译时具有类型,就像变量一样。如果数字常量包含小数点且没有类型后缀,则其类型为double。如果它不包含小数点且没有后缀,则将是整数类型之一(该类型取决于常数的值和相关类型的范围)。因此,没有任何与常量类型有关的加速或减速。

在进行计算时,整数算术往往比浮点数快,因此通常除非必要,否则不要使用浮点数。

答案 1 :(得分:1)

  

当我实现带有各种常量的数学公式时,是否应该始终将.0放在最后以确保其内部用作双精度数?

仅当您需要确保结果为GET http://localhost:8080/background.png 404 (Not Found) 时。如果要得到整数结果,请不要附加double。如果要得到.0的结果,请附加float

答案 2 :(得分:1)

  

当我实现带有各种形式的数学公式时   这样的常量,我应该始终将.0放在最后以确保其   内部用作double吗?

如果确实要使常量具有类型double,那么可以,对于这种类型的常量,应使用其中一种形式。如果这些常量的分数部分为零,并且没有指数表示,则将.0附加为将其设置为这种形式的好方法。

另一方面,不,您不应该盲目地对所有常量使用.0。与变量一样,您需要注意每个常量要具有的类型。使用相应的表格。

  

是否加快了   我的程序?

常量的类型可能会影响程序的正确性,因为这确实是您的起点。在这种情况下,相对性能无关紧要。不管您执行的速度有多快,它都不会帮助您执行错误的计算。另一方面,从整数常量更改为浮点常量不会影响计算的正确性,这可能是因为常量出现的上下文始终需要转换。在那种情况下,编译器很可能只在第一位插入了转换类型的常量。这样就不会影响运行时性能。

  

如果必须常量,则需要做多少额外的工作   从int转换为double吗?

在运行时,通常没有。如上所述,常量的隐式和显式转换 通常都将在编译时执行。

  

在所有因子的末尾写上“ .0”是否为“纯净代码”?

是否全部都是double?是的,很干净。如果您不记得要注意常量的类型,那么它可以使您摆脱麻烦。

当我看到代码在隐式整数->无论如何都将执行浮点转换的上下文中精心使用浮点常量和整数值的代码时,对我来说确实有点过头了,但这是有效的选择,合理的目的。

答案 3 :(得分:1)

我是这样的

float c;
int a,b;
a=5;b=6;
c=(float)(a+b)/2;

只需广播即可。双重加倍。这样,您可以避免添加.0f和其他内容的麻烦,并且代码保持干净(可读)。

浮动

#include<stdio.h>
int main(){
  double c;
  int a = 20,b = 3;
  c=(float)a/b;
  printf("c:%.10f\n",c);
  return 0;
}

输出:

  

c:6.6666665077

#include<stdio.h>
int main(){
  double c;
  int a = 20,b = 3;
  c=(double)a/b;
  printf("c:%.10f\n",c);
  return 0;
}

输出:

  

c:6.6666666667