【问题标题】:Difference between void and float function in CC中void和float函数的区别
【发布时间】:2020-05-18 09:06:16
【问题描述】:

我正在上 Udemy C 课程,对 C 中的函数产生了一些疑问。其中一个练习是关于使用函数的温度转换(摄氏度、F 和 K),当我的第一个想法是:

void CF(){
    float temp1, temp2;

    printf("Escribe que temperatura quieres convertir a Fahrenheit: ");
    scanf("%f", &temp1);

    temp2 = (temp1 * 1.8) + 32;

    printf("La temperatura en Fahrenheit es: %f", temp2);
}

但解决的练习使用:

float fahrenheit(float C){
    float F=0;
    F = (9*C)/5 + 32;
    return F;
}

在我通过函数介绍的同时,通过“int main”程序输入数据。

我的问题是: - 引入数据最好是通过int主代码还是函数? - 为什么他使用“Float”函数而我使用“void”函数并且在这两种情况下都可以正常工作?

无论如何,我的代码有效,但我想知道什么更好以及为什么。

提前感谢并原谅我的英语。

【问题讨论】:

  • float fahrenheit(float C){ 将更具可重用性,因为它不关心数据的来源。您的解决方案仅适用于来自标准输入的输入
  • 我明白了。谢谢。
  • @Albert 只是改变返回类型并没有做任何事情;您还需要实际返回一个值。
  • 从另一个角度来看:第二个版本实际上是一个数学意义上的函数——它将输入值映射到输出值。函数的输出只取决于输入参数,相同的输入总是产生相同的输出。这就是所谓的“纯”功能。其优点之一是此类功能易于测试。另一方面,您的 void 函数通过副作用进行操作,这使得测试和重用变得更加困难。
  • @PaulOgilvie C 正式将该术语定义为 (C17 5.1.2.3) “访问 volatile 对象、修改对象、修改文件或调用执行任何这些操作的函数都是 side effects, ..." 如果流 stdout 被视为“文件”,但 printf 肯定会在内部修改各种对象,这是有争议的。

标签: c function


【解决方案1】:

函数的目的是封装一个经常使用的计算。如果将其编码为返回值,则可以在更大的程序中随时调用它,无论是否要打印结果。因此第二个函数更可重用。

虽然您编写函数的方式没有任何问题,但它假定您坐在键盘旁输入值,并且您只想查看转换结果。

现在假设您编写了一个工具,该工具获取摄氏温度列表(来自电子表格),并希望将它们全部转换为华氏温度。您的函数在这里不起作用,但第二个版本可以与它周围的包装一起使用,以从电子表格中读取摄氏度值,调用该函数,然后将转换后的值放在其他地方。

一般来说a good design principle是为了尽量减少一个函数的功能,这样可以在更多不同的情况下使用。

【讨论】:

    【解决方案2】:

    我的问题是: - 通过 int 主代码或函数引入数据更好? - 为什么他使用“Float”函数而我使用“void”函数并且在这两种情况下都可以正常工作?

    最好使用后者(返回float的函数)。

    为什么?

    因为它使代码更具可重用性。

    您的函数可能工作正常,但如果您只想在不用户输入的情况下从华氏转换为 C 怎么办?

    你的函数的作用基本上是:

    • 打印到控制台
    • 扫描用户输入
    • 进行实际转换
    • 输出结果

    所以你看,在第一个函数中你做的不仅仅是转换。

    【讨论】:

      【解决方案3】:

      对我来说,如果可以选择,我会将代码编写为第二个选项(返回 float 值)。那是因为它更短、更便携且可重复使用。例如,如果您必须多次调用该函数:

      for(int i = 0; i < 10000; i++) {
          float F = fahrenheit(i*1.0);
      }
      

      如果使用第一种解决方案,则必须输入10000 次。太难了。

      【讨论】:

        【解决方案4】:

        第一个函数(您的解决方案)不是将值转换为另一个值的函数,它在屏幕上显示信息、等待用户输入、转换值并打印结果。该函数不仅可以转换,还可以做许多其他事情(输入/输出)。

        它比给定一个值、将其转换为另一个值的第二个函数要具体得多,仅此而已。第二个功能比第一个更可重用,您可以在需要进行转换的任何地方使用它!然后第一个函数可以用第二个类似的函数重写:

        /*
         * General purpose function that converts a celsius value into a fahrenheit value.
        */
        float fahrenheit(float C) {
            float F=0;
            F = C*1.8+32;
            return F;
        }
        
        void CF(){
            float temp1, temp2;
        
            printf("Escribe que temperatura quieres convertir a Fahrenheit: ");
            scanf("%f", &temp1);
        
            temp2 = fahrenheit(temp1); // convert temp1 to fahrenheit
        
            printf("La temperatura en Fahrenheit es: %f", temp2);
        }
        

        然后可以使用fahrenheit 函数,因为您可以使用sin 或cos 等。它是将摄氏度转换为华氏度的数学函数的计算描述。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-02
          • 1970-01-01
          • 2013-06-26
          • 1970-01-01
          • 2019-12-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多