为什么这个double类型变量作为函数参数传递时默认为int?

Why is this double type variable default to int when passed as a function parameter?

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

#include <stdio.h>

double x;


double myfunc(x){
    return x;    
}

void main(){

}

我知道这是错误的,但不知道为什么会出现以下错误:

main.c:14:8: warning: type of ‘x’ defaults to ‘int’ [-Wimplicit-int] 

谁能帮我理解计算机是如何解释这段代码的?

He was defining his function parameters in the global scope

不,他没有。

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

前者是全局的 double,后者是函数的局部变量,正如编译器警告的那样,“默认为 int” .

I get this is wrong

没有错,但不可能。

全局变量

double x;

func的参数x无关。

由于未提供 x 类型,编译器默认为 int 类型(C99 之前)。但是这个假设是无效的,因为 C99.

因此,要么指定 x 的类型(例如:double func(double x) { ...}),要么如果您想使用全局 x,则根本不向其传递任何参数.

作为一般规则,避免使用全局变量。或者至少让它 static 以便它在翻译单元之外不可见。

您的朋友使用的是较旧的 K&R 风格的函数定义,其中参数类型与参数列表分开指定。如果操作正确,它看起来像这样:

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

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

double myfunc( double x )
{
  return x;
}

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

在旧版本的 C 中,如果一个函数没有 return 类型,或者如果一个参数没有用类型声明,编译器会假定它有 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.
$ _

所以你可以看到正在进行自动转换,将传递给函数的 double 转换为 int,以符合参数类型。如果你 运行 该程序,你将得到

$ pru
3
$ _