【问题标题】:Why is this double type variable default to int when passed as a function parameter?为什么这个 double 类型变量在作为函数参数传递时默认为 int?
【发布时间】:2020-04-17 15:15:52
【问题描述】:

我正在学习 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] 

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

【问题讨论】:

    标签: c variable-declaration function-parameter


    【解决方案1】:

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

    不,他没有。

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

    前者是全局的double,后者是函数的本地,并且编译器警告“默认为int”。

    我知道这是错误的

    没有错,但不可能。

    【讨论】:

      【解决方案2】:

      全局变量

      double x;
      

      func的参数x无关。

      由于未提供x 的类型,编译器默认为int 类型(C99 之前)。但是这个假设在C99之后是不成立的。

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

      一般来说,避免使用全局变量。或者至少将其设为static,以便在翻译单元之外不可见。

      【讨论】:

        【解决方案3】:

        您的朋友使用的是较旧的 K&R 风格的函数定义,其中参数类型与参数列表分开指定。如果操作正确,它将如下所示:

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

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

        double myfunc( double x )
        {
          return x;
        }
        

        注意这个参数x与全局变量x无关——它是一个完全独立的对象。

        在旧版本的 C 中,如果一个函数没有返回类型,或者如果一个参数没有用类型声明,编译器会假定它的类型为 int。隐式 int 类型在 1999 年标准 IINM 中被取消,不应依赖。

        【讨论】:

          【解决方案4】:

          当你写作时:

          double myfunc(x){
              return x;    
          }
          

          您正在以 Kernighan & Ritchies 第一版“The C Programming Language”一书的传统风格声明一个函数。

          这种风格仍然存在,允许您声明一个函数,只需命名它的参数(它们始终是函数的局部,因此全局 x 是与参数 @987654323 不同的变量@ 到函数),并且由于您没有指定其类型,因此它默认为 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
          $ _
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-28
            • 1970-01-01
            • 2014-08-08
            • 1970-01-01
            • 2016-11-24
            • 1970-01-01
            • 2015-10-16
            • 1970-01-01
            相关资源
            最近更新 更多