为什么这个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
$ _
我正在学习 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
$ _