【问题标题】:Why do you skip void function calls without catching them? [closed]为什么你跳过 void 函数调用而不捕获它们? [关闭]
【发布时间】:2017-12-04 14:34:05
【问题描述】:

我想调用一个计算圆宽度的函数。

#include <stdio.h>
void area(double*);
int main()
{
    void* vp = NULL;
    double r;
    printf("input value : ");
    scanf(" %lf", &r);
    (double*)vp = &r;
    void area(vp);
}
void area(double* dp)
{
    double result;
    result = (*dp) * (*dp) * (3.14);
    printf("circle are is : %.2lf", result);
    return 1;
}*

我想在 //void 区域 (vp)// 中调用一个函数,但是我无法在可视 stdio 中捕获错误并按原样继续。你知道是什么原因吗?

【问题讨论】:

  • 作业中的演员vp = &amp;r 不需要。
  • @Someprogrammerdude “visual-studio-2015”标签可能意味着期望像 20 年前那样标准化的 C 行为在这里要求太多了......
  • 嗯。 area() 具有返回类型 void,但返回 int
  • 如果你的函数声明它会返回一个void,你就不能返回一个值。
  • 基本上,大部分都不是有效的 C。你需要一本好的 C 编程书籍和更好的编译器。

标签: c return function-call


【解决方案1】:

调用函数,你写area(vp); 不是 void area(vp);

后者在函数main 中出现,是一个函数原型,没有运行时影响。

并修正 PI 的定义:鉴于您使用 double 类型,您的定义非常不充分。见Math constant PI value in C

【讨论】:

  • 是函数声明吗?在某些方面,它最接近那个,但vp 不是类型名称,所以我认为它只是一个混合的混乱。 void 阻止它成为函数调用; vp 阻止它成为函数声明。
【解决方案2】:

你应该写

  area(&r);

而不是错误和多余的

 void area(vp);

加上你在语法中犯的明显错误

  • 我看不出有任何理由让vp 出现。

  • 为确保scanf() 成功,请始终检查调用的返回值。

  • 引用C11,第 6.8.6.4 章,

    带有表达式的return 语句不应出现在返回类型为 是void。 [....]

【讨论】:

    【解决方案3】:

    代码存在三个问题。

    对于初学者来说,不清楚为什么指针 vp 被声明为具有 void * 类型,尽管在程序中它仅用于指向 double 类型的对象。

    为什么不这样声明呢

    double *vp = NULL;
    

    结果这个技巧用指针

    (double*)vp = &r;
    

    将无法编译,因为左侧的表达式 (double*)vprvalue 并且可能没有被赋值。

    你可以写

    vp = &r;
    

    第二个问题是这个说法

    void area(vp);
    

    也是无效的。要调用该函数,您应该编写

    area(vp);
    

    第三个问题是返回类型为void的函数不能在return语句中指定表达式

    此声明将被删除。

    return 1;
    

    来自 C 标准(6.8.6.4 的 return 语句)

    1 带有表达式的返回语句不应出现在 返回类型为 void 的函数。 没有 表达式只能出现在返回类型为 void 的函数中。

    将函数的参数声明为具有引用类型是没有意义的。

    函数定义可能如下所示

    double area( double dp )
    {
        const double PI = 3.14;
    
        return dp * dp * PI;
    }
    

    调用 pf printf 的语句应该移到 main 中

    printf( "circle are is : %.2lf", area( r ) );
    

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 2010-09-12
      • 2011-11-14
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多