为什么将双精度型变量作为函数参数传递时默认设置为int?

我正在学习C,并且正在尝试帮助调试好友代码。 他正在全局范围内定义他的函数参数,然后将它们传递到函数def中,如下所示:

associatedtype

我理解这是错误的,但不是为什么出现以下错误:

#include <stdio.h>

double x;


double myfunc(x){
    return x;    
}

void main(){

}

有人可以帮助我了解计算机如何解释此代码吗?

libenlai04261 回答:为什么将双精度型变量作为函数参数传递时默认设置为int?

他正在全局范围内定义函数参数

不,他没有。

全局x与函数的参数x无关。

前者是全局double,后者是函数的局部变量,并且在编译器警告时,“ 默认为int ”。

我理解这是错误的

这没错,但不可能。

,

全局变量

double x;

x的参数func无关。

由于未提供x类型,因此编译器默认为int类型(C99之前的版本)。但是,此假设自C99起是无效的。

因此,如果要使用全局x,请为double func(double x) { ...}指定类型(例如:x),或者根本不向其传递任何参数。 / p>

通常,请避免使用全局变量。或者至少将其设置为static,以使它在翻译单元之外不可见。

,

您的朋友正在使用较旧的K&R样式的函数定义,其中参数类型与参数列表分开指定。如果正确完成,它将如下所示:

double myfunc(x)
  double x;
{
  return x;
}

但是,最好使用原型语法,其中使用参数名称指定参数类型:

double myfunc( double x )
{
  return x;
}

请注意,此参数x与全局变量x无关-它是一个完全独立的对象。

在C的较早版本中,如果函数没有返回类型,或者没有使用类型声明参数,则编译器会假定其具有类型int。隐式int的键入已在1999年标准IINM中取消,因此不应依赖。

,

撰写时:

double myfunc(x){
    return x;    
}

您要声明的是Kernighan&Ritchies第一版“ The C Programming Language”的旧版功能。

这种样式仍然存在,可以让您声明一个仅命名其参数的函数(它们始终在该函数中本地,因此全局x是与参数不同的变量x到该函数),并且,如果您未指定其类型,则默认为int。因此,您实际上是在(ANSI-C中)声明以下功能:

double myfunc(int x){
    return x;    
}

,如您所见,它带有一个整数参数。

函数的参数始终是函数的本地,您不能使其成为全局变量。

注意:

如果要使用旧样式C定义函数,则正确的定义为:

double myfunc(x)
    double x;
{
    return x;    
}
ANSI-C中的

是:

double myfunc(double x)
{
    return x;    
}

我试图在计算机上编译下一个程序:

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

double myFunc(x)
{
        return x;
}

int main()
{
        printf("%g\n",myFunc(M_PI));
}

具有以下警告

$ make pru
cc -O2 -pipe  pru33336.c  -o pru33336
pru33336.c:11:24: warning: implicit conversion from 'double' to 'int' changes value from 3.141592653589793 to 3 [-Wliteral-conversion]
        printf("%g\n",myFunc(M_PI));
                       ~~~~~~ ^~~~
/usr/include/math.h:149:15: note: expanded from macro 'M_PI'
#define M_PI            3.14159265358979323846  /* pi */
                        ^~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
$ _

因此您可以看到正在进行自动转换,以将传递给函数的双精度转换为int,以符合参数类型。如果您运行该程序,您将得到

$ pru
3
$ _
本文链接:https://www.f2er.com/2419060.html

大家都在问