为什么要跳过 void 函数调用而不捕获它们?
Why do you skip void function calls without catching them?
我想调用一个计算圆的宽度的函数。
#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 area (vp)// 中调用一个函数,但我无法在 visual stdio 中捕获错误并按原样继续。你知道是什么原因吗?
为了调用函数,你写area(vp);
不是void area(vp);
.
后者出现在函数 main
中,是一个 函数原型 并且没有 运行 时间效应。
并修改 PI 的定义:考虑到您使用 double
类型,您的定义非常不合适。参见 Math constant PI value in C
你应该写
area(&r);
而不是错误和多余的
void area(vp);
加上你在语法中犯的明显错误
我不认为 vp
有任何理由在那里。
为确保 scanf()
成功,始终检查调用的 return 值。
引用 C11
,章节 §6.8.6.4,
A return
statement with an expression shall not appear in a function whose return type
is void
. [....]
代码存在三个问题。
对于初学者来说,不清楚为什么指针 vp
被声明为 void * 类型,尽管在程序中它仅用于指向 double 类型的对象。
为什么不像
那样声明呢
double *vp = NULL;
结果这个技巧用指针
(double*)vp = &r;
不会编译,因为在左侧表达式 (double*)vp
是 rvalue
并且可能无法分配。
你可以直接写
vp = &r;
第二个问题就是这个语句
void area(vp);
也是无效的。要调用你应该写的函数
area(vp);
第三个问题是 return 类型为 void 的函数不应在 return 语句
中指定表达式
应删除此声明。
return 1;
来自C标准(6.8.6.4 return语句)
1 A return statement with an expression shall not appear in a
function whose return type is void. A return statement without an
expression shall only appear in a function whose return type is void.
将函数的参数声明为具有引用类型是没有意义的。
函数定义可能类似于
double area( double dp )
{
const double PI = 3.14;
return dp * dp * PI;
}
调用 pf printf 的语句应该移到 main
printf( "circle are is : %.2lf", area( r ) );
我想调用一个计算圆的宽度的函数。
#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 area (vp)// 中调用一个函数,但我无法在 visual stdio 中捕获错误并按原样继续。你知道是什么原因吗?
为了调用函数,你写area(vp);
不是void area(vp);
.
后者出现在函数 main
中,是一个 函数原型 并且没有 运行 时间效应。
并修改 PI 的定义:考虑到您使用 double
类型,您的定义非常不合适。参见 Math constant PI value in C
你应该写
area(&r);
而不是错误和多余的
void area(vp);
加上你在语法中犯的明显错误
我不认为
vp
有任何理由在那里。为确保
scanf()
成功,始终检查调用的 return 值。引用
C11
,章节 §6.8.6.4,A
return
statement with an expression shall not appear in a function whose return type isvoid
. [....]
代码存在三个问题。
对于初学者来说,不清楚为什么指针 vp
被声明为 void * 类型,尽管在程序中它仅用于指向 double 类型的对象。
为什么不像
那样声明呢double *vp = NULL;
结果这个技巧用指针
(double*)vp = &r;
不会编译,因为在左侧表达式 (double*)vp
是 rvalue
并且可能无法分配。
你可以直接写
vp = &r;
第二个问题就是这个语句
void area(vp);
也是无效的。要调用你应该写的函数
area(vp);
第三个问题是 return 类型为 void 的函数不应在 return 语句
中指定表达式应删除此声明。
return 1;
来自C标准(6.8.6.4 return语句)
1 A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.
将函数的参数声明为具有引用类型是没有意义的。
函数定义可能类似于
double area( double dp )
{
const double PI = 3.14;
return dp * dp * PI;
}
调用 pf printf 的语句应该移到 main
printf( "circle are is : %.2lf", area( r ) );