[在以下代码中,我正在使用PI
外部的函数来计算main()
。两者之间的唯一区别是:
void calculate_pi ();
calculate_pi (void);
。我本以为第二个更好,但事实并非如此。为什么是这样?谢谢!
第一密码:
#include <stdio.h>
#include <stdlib.h>
void calculate_pi ();
int main(void)
{
calculate_pi ();
return 0;
}
void calculate_pi ()
{
int i, signo;
double pi_approx = 1, pi_final;
for (i = 1; i < 1000000; ++i)
{
signo = (i%2) ? -1 : 1;
pi_approx = pi_approx + (float) signo / (2*i+1);
}
pi_final = pi_approx * 4;
printf("%.10f\n", pi_final);
}
第二代码:
#include <stdio.h>
#include <stdlib.h>
void calculate_pi (void);
int main(void)
{
calculate_pi (void);
return 0;
}
void calculate_pi (void)
{
int i, signo;
double pi_approx = 1, pi_final;
for (i = 1; i < 1000000; ++i)
{
signo = (i%2) ? -1 : 1;
pi_approx = pi_approx + (float) signo / (2*i+1);
}
pi_final = pi_approx * 4;
printf("%.10f\n", pi_final);
}
[在函数的声明/定义中使用void
作为参数与在实际调用函数时作为参数是有区别的。
“绝对不能使用void表达式(具有void类型的表达式)的(不存在)值,并且不得将隐式或显式转换(除void之外)应用于此类表达式。任何其他类型都将作为void表达式求值,其值或指示符将被丢弃。(对void表达式的副作用进行求值。)“
来源:C18,6.3.2.2 / 1
void
只能用作参数,而不能用作函数调用中的参数。不得使用类型为void
的表达式。否则,这是未定义的行为。
如果定义为calculate_pi
,则需要将calculate_pi()
称为(return type) calculate_pi (void)
。
基于@KamilCuk的注释,那么正确的代码应为:
#include <stdio.h>
#include <stdlib.h>
#define PI 3.14159265359
void calculate_pi (void);
int main(void)
{
calculate_pi ();
return 0;
}
void calculate_pi (void)
{
int i, signo;
double pi_approx = 1, pi_final;
for (i = 1; i < 1000000; ++i)
{
signo = (i%2) ? -1 : 1;
pi_approx = pi_approx + (float) signo / (2*i+1);
}
pi_final = pi_approx * 4;
printf("%.10f\n", pi_final);
}