【问题标题】:Which one is a better approach if any?如果有的话,哪一个是更好的方法?
【发布时间】:2020-08-22 18:41:44
【问题描述】:

我正在尝试从《C 编程语言》一书中学习 C,其中一个练习是制作华氏到摄氏度的转换器。

我遵循书籍风格和说明的代码是:

#include <stdio.h>
int main() {
   float fhr;
   for (fhr = 0; fhr <= 300; fhr += 20)
      printf("%3.1f %6.1f\n", fhr, (5.0/9.0)*(fhr-32));
}

书上说:

我只是想知道创建一个摄氏度变量然后在 printf 函数中将其作为参数调用更好还是以这种方式执行更好,从人类可读性和 更重要的是它是否对编译器(即让程序运行得更快或更慢。)

谢谢。

【问题讨论】:

  • 无关:在处理浮点值时首选double
  • 它不太可能与现代编译器有任何区别。哪个偏好更好是主观的;根据所讨论表达式的复杂性,任何一个都可能“更好”。
  • 你认为哪个最容易调试?

标签: c


【解决方案1】:

创建一个变量然后将其传递给 printf 肯定会提高可读性。

从编译器的角度来看,没有实际的区别。它不会以任何方式影响运行时性能。当涉及到编译器执行的内部优化时尤其如此。

【讨论】:

  • 好的,谢谢。所以基本上,既然它对性能没有任何影响,那么创建一个变量然后传递它肯定会更好,因为这种风格有一个正面的可读性而不是真正的负面。
  • 是的,我会这样做
【解决方案2】:

从编译器的角度来看,它可能确实会产生影响。根据编译器的不同,它可能会看到该变量仅使用一次并且无论如何“内联”该值。许多人可能不会,这会对整体性能造成影响。话虽如此,性能损失将是无关紧要的。

至于可读性,将其存储为自己的变量会更容易查看和以后维护。尽管对于像这样的小程序,差异也无关紧要;但是,它可能会开始在较大的程序中产生影响,尤其是当该值将被多次使用时。

#include <stdio.h>
int main()
{
   float fhr;
   for (fhr = 0; fhr <= 300; fhr += 20)
   {
      float celsius = (5.0/9.0)*(fhr-32);

      printf("%3.1f %6.1f\n", fhr, celsius);
   }
}

您可能还想考虑使用函数来抽象出如何确定该值。同样,这确实会影响性能,并且对于这样一个小程序来说不是必需的,但可以提供一种方法来确定程序中更多位置的值。这意味着您不需要依赖传递值或将变量放在范围内:

float fahrenheit_to_celsius(float fhr)
{
    return 5.0 / 9.0 * (fhr - 32)
}

int main()
{
   float fhr;
   for (fhr = 0; fhr <= 300; fhr += 20)
   {
      float celsius = fahrenheit_to_celsius(fhr);

      printf("%3.1f %6.1f\n", fhr, celsius);
   }
}

【讨论】:

    【解决方案3】:

    你也可以使用一个函数,它不会变慢,而且可读性更好(在我看来)!

    #include <stdio.h>
    
    double fhr_to_cls(double fhr)
    {
        return ((5.0 / 9.0) * ( fhr - 32));
    }
    
    int main()
    {
       double fhr;
    
       for (fhr = 0; fhr <= 300; fhr += 20)
           printf("%3.1f %6.1f\n", fhr, fhr_to_cls(fhr));
    }
    

    【讨论】:

    • +1 作为答案,这是最糟糕的方式有一个很大的原因。我不认为编译器会内联这个函数,你正在使用更多的内存,这样的每个函数都必须有内存用于参数和返回值加上每个调用的两个跳转语句。你可以做的是内联这个函数,然后你就摆脱了所有这些。这是一些指南:geeksforgeeks.org/inline-function-in-c
    • 感谢您的评论,我今天学到了一些东西!
    【解决方案4】:

    关于:

    for (fhr = 0; fhr <= 300; fhr += 20)
      printf("%3.1f %6.1f\n", fhr, (5.0/9.0)*(fhr-32));
    

    03002032 都是 integers 代码试图填充到 float

    5.0and9/0aredoubles`

    纠正以上所有,建议:

    for ( fhr = 0.0f; fhr <= 300.0f; fhr += 20.0f )
        printf("%3.1f %6.1f\n", fhr, (5.0f / 9.0f )*(fhr-32.0f));
    

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 2016-08-07
      • 2013-05-03
      相关资源
      最近更新 更多