我正在学习C,并且正在尝试帮助调试好友代码。 他正在全局范围内定义他的函数参数,然后将它们传递到函数def中,如下所示:
associatedtype
我理解这是错误的,但不是为什么出现以下错误:
#include <stdio.h>
double x;
double myfunc(x){
return x;
}
void main(){
}
有人可以帮助我了解计算机如何解释此代码吗?
我正在学习C,并且正在尝试帮助调试好友代码。 他正在全局范围内定义他的函数参数,然后将它们传递到函数def中,如下所示:
associatedtype
我理解这是错误的,但不是为什么出现以下错误:
#include <stdio.h>
double x;
double myfunc(x){
return x;
}
void main(){
}
有人可以帮助我了解计算机如何解释此代码吗?
他正在全局范围内定义函数参数
不,他没有。
全局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
$ _