黑马程序员技术交流社区
标题:
关于函数调用的问题
[打印本页]
作者:
陈冲
时间:
2012-7-7 09:31
标题:
关于函数调用的问题
本帖最后由 陈冲 于 2012-7-7 11:43 编辑
class FunctionDemo
{
public static void main(String[] args)
{ //在使用函数时,与C++不一样,不需要声明
int c=add(3,4);
System.out.println("c="+c);
}
static int add (int a,int b)
{
//对两个数求和,并返回和的值
return a+b;
}
}
复制代码
以前学习C++,调用函数以前需要进行原型声明。
刚开始学习Java,今天看毕老师的视频,在函数部分,发现在调用函数时,不需要进行函数的原型声明,这到底是为什么?
有没有人给讲解一下啊,没弄明白总觉的心里有点不舒服。
作者:
张凯
时间:
2012-7-7 09:51
你好,我以前也是学的c++,从没深入的想过这个问题,以为就是以为不同语言的书写规范,今天特意查了下资料,是这样的:
C/C++语言规定,标识符必须先声明后引用。引用未经声明或者类型(如果有的话)和声明不符的标识符属于语法错误。函数名是描述有类型对象的标识符,函数调用是对函数名的引用,因此函数调用之前必须声明,否则编译器会报错。
从编译的角度来说,声明是对编译器的提示,使编译器在解析标识符引用时类型验证等语法检查工作不必搁置起来占用内存,或者在后续代码中查找定义消耗额外时间。这点对于早期硬件条件吃紧的环境下的编译效率有重要意义。但是随着硬件条件的改善,这个特性的优势已经变得不是那么明显,反而加重程序员的负担。相对于C/C++,一些更“现代”的类C语言(Java、C#、D语言等)中不再有“先声明后引用”的限制。
希望能帮到你。
作者:
夏儒日
时间:
2012-7-7 09:56
呵呵...这位兄弟果断C++犀利啊!!{:soso_e112:}老毕视频就说过...c++越厉害的人再学Java思想就比较难转变~~~
Java程序运行时虚拟机会先找到这个程序的main函数,接着从main函数里面取出一条条代码来执行.以你上面的程序为例,当执行到main函数里面的 int c=add(3,4);
语句时,程序会会跳转到static int add (int a,int b)这个函数的内部去执行,先把实参分别赋值给(int a,int b),然后再返回a+b的结果.
你这是简单的函数调用,在本类的函数可直接调用,但类与类之间的函数调用就涉及更多的原则了,到时候你学到的时候自然就会有体会.
作者:
曹恒业
时间:
2012-7-7 10:07
class FunctionDemo
{
public static void main(String[] args)
{ //在使用函数时,与C++不一样,不需要声明
int c=add(3,4);
System.out.println("c="+c);
}
static int add (int a,int b)
{
//对两个数求和,并返回和的值
return a+b;
}
}
复制代码
以前学习C++,调用函数以前需要进行原型声明。
刚开始学习Java,今天看毕老师的视频,在函数部分,发现在调用函数时,不需要进行函数的原型声明,这到底是为什么?
有没有人给讲解一下啊,没弄明白总觉的心里有点不舒服
===========================================
因为C++和Java在程序编译和运行时的机制略有区别。
C++要调用函数,如果main函数中用到了其他函数,而其它函数的位置又在main函数之后编写,则在main函数之前要对需要调用的函数进行函数的原型声明才能使用,否则编译器不能识别。简单的说在预处理时,main前的函数声声明就是函数原型声明,告诉编译器后面出现的方法的基本信息,返回类型,函数名,参数列表信息。
Java中先使用javac命令对java文件进行编译,此时会加载类文件,而java作为纯面向对象语言,函数都在类中,所以编译器在加载类时,就已经把其中的函数加载到内存中的方法区了,在最后编译main方法时,就可以识别程序中出现的其它函数,所以java中函数不需要原型声明,即函数定义的位置在前在后不受影响。
从C++和java编译和运行的原理来理解即可。
作者:
康子龙
时间:
2012-7-7 10:19
每个语言都有自己的语法定义,这个没啥为什么吧?内在的运行机制不同呗
作者:
滔哥
时间:
2012-7-7 22:29
回答都很详细,为表鼓励,统一给你们加一分,望继续保持。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2