簡體   English   中英

C 程序總是給我同樣的 output 0.00?

[英]C program keeps giving me the same output of 0.00?

我是 c 的新手,我的輸入是 16.7 和 28.6,這是我的代碼,我需要知道為什么我只得到 0.00 作為答案,必須保存高度半徑和 pi 作為 double 的任何幫助表示贊賞。

#include <stdio.h>
#include <math.h>


float coneSurfaceArea(double radius, double height, const double pi);


int main()
{
    double radius;
    double height;
    const double pi = 3.14;
    
    printf("Enter the radius: ");
    scanf("%lf", &radius);
    printf("Enter the height: ");
    scanf("%lf", &height);
    printf("The total surface area of the cone is %.2f", coneSurfaceArea);
    return 0;
}

float coneSurfaceArea(double radius, double height, const double pi)
{
    float SA = pi * radius * (radius + sqrt(radius * radius + height * height));
    return SA;
}

無論您使用什么編譯器,打開它的可選警告(診斷,無論您的編譯器如何調用它們),沒有半途而廢的編譯器會毫無怨言地接受此代碼。 但不幸的是,許多編譯器默認發出很少的警告。

GCC 確實指出了問題,即使默認情況下也是如此。

a.c:18:54: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float (*)(double,  double,  const double)’ [-Wformat=]
   18 |     printf("The total surface area of the cone is %.2f", coneSurfaceAre);
      |                                                   ~~~^   ~~~~~~~~~~~~~~
      |                                                      |   |
      |                                                      |   float (*)(double,  double,  const double)
      |                                                      double

如果您不熟悉語法: float (*)(…)是指向 function 的指針的類型,采用第二對括號中描述的 arguments 並返回一個float值。 coneSurfaceAre is a function, and since C mostly doesn't manipulate functions as such, a function is treated as a pointer to the function in most contexts.

printf function 需要一個double類型的值,但您傳遞的是指向 function 的指針。 根據系統的不同,這可能會導致打印無意義的值、崩潰、程序繼續但 memory 損壞等。

當您想要 function 返回的值時,您需要調用此 function,並將其傳遞給 arguments。 main function 和coneSurfaceArea區域 function 中的變量使用相同的名稱可能對人類有幫助,但就計算機而言,這些是完全不同的變量。

    printf("The total surface area of the cone is %.2f",
           coneSurfaceArea(radius, height, pi));

如果需要,您可以傳遞其他值。

    printf("The total surface area of a cone with twice the height is %.2f",
           coneSurfaceArea(radius, 2 * height, pi));

順便說一句, %f格式的 printf 需要一個double參數¹。 在這里,您傳遞了一個float 由於促銷,這實際上是正確的:當您將某些“小”類型傳遞給int (如printf ,它采用可變數量的short ,它們被提升為更大的類型,例如,浮點型和float double 但是在更復雜的情況下,如果您不小心,您可能會遇到問題。 堅持使用通常更簡單double 並且一直使用double通常比使用float稍微一點,因為使用float只會導致相同的計算,然后進行轉換。 當程序處理大量數字時, float有一個優勢,因為這樣您可以節省 memory,並且在某些情況下,可以利用向量指令來執行兩個獨立的float運算,就像一個double精度運算一樣快。

¹scanf不同,它確實需要一個指向float%f指針和一個指向double%lf的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM