我上了Java的课程,正在努力自学C和K
#include <stdio.h>
float convert(int); **//Why is this needed...**
main()
{
int i;
for(i = 0; i <= 300; i += 20)
printf("F: %3d C: %6.1f\n",i,convert(i));
system("Pause");
return 0;
}
float convert(int f) **//When we already have this?**
{
float c = (5.0/9.0) * (f-32.0);
return c;
}
在Java中,您可以声明一个类似于公共静态浮点转换(int f)的函数,而不需要原型。这对我来说似乎简单得多。为什么会有差异?
在C语言中,通常必须先声明标识符,然后才能使用它。函数原型用作函数的声明。C是一种古老的语言,强制程序员声明函数标识符有助于编译器/链接器的编程,尤其是在不同的翻译单元中使用和定义函数时。
Java编译器可以通过名称和包找到类,并直接检查源代码。注意:如果Java编译器不能做到这一点,它将不会编译。
在C语言中,对您可以放置的定义没有限制,因此您必须首先让它知道您稍后可能会定义什么。
这本质上是为语言系统做出的决定。
请注意,Java和C编译器都需要知道函数签名,以便它们可以进行类型检查并编译代码。
还要注意,像C这样的语言需要您单独提供这个签名/原型(在声明中),而实际上函数定义具有完全相同的信息。所以,这基本上是信息的重复。为什么会这样?本质上,这是为了在没有包含定义的实际源代码的情况下编译代码。因此,如果库是以二进制代码的形式提供的,那么拥有包含原型的头就足以允许编译使用库中代码的其他代码。
像Java和C这样的现代语言不再需要重复这个原型信息。当他们确实需要原型时,他们如何编译代码?他们所做的是在处理定义时将原型信息与二进制代码一起存储。所以,实际上,原型信息是由编译器本身自动生成的。
问题内容: 这有任何重要目的吗?可以省略吗? 问题答案: 并非总是必要的,但是它确实有其用途。假设我们想在基类上创建一个复制方法。像这样: 现在,当我们创建一个新的并复制它时会发生什么? 该副本不是的实例。这是因为(没有显式检查),我们无法从“基本”类返回副本。我们只能返回。但是,如果我们重置了构造函数: …然后一切都按预期进行:
为什么需要泛型 前言 泛型程序最早出现1970年代的CLU和Ada语言中, 后来被许多机遇对象和面向对象的语言锁采用 1993年C++在3.0版本中引入的模板技术就属于泛型编程 1994年7月ANSI/ISO C++标准委员会通过的STL更是泛型编程的集大成者, 它已被纳入1998年9月C++标准之中. 2004年9月Java在J2SE 5.0(JDK 1.5)中开始使用泛型技术; 2005年11
问题内容: 我正在用查询执行ajax请求,想知道为什么我的响应已经是JS对象。 如果我做一个 ‘obj’为null,但是我可以将’response’用作js对象数组。 这不是真正的问题,但是我想了解这种行为。 谢谢 问题答案: 当您进行AJAX调用并指定dataType JSON时,就会发生这种情况jQuery会在响应中为您调用jQuery.parseJSON。实际上,您可以根据数据类型指定要调用
我有一个方法,它检查一个对象是否已经存在于数组列表中,如果存在,则用新对象替换索引,如果不存在,则添加新对象。 当我编写方法时,我没有返回类型。我收到一个错误,建议我将返回类型设置为void,所以我就这样做了。然后我得到了另一个错误,返回类型必须是布尔的。我唯一的问题是方法本身本质上(至少对我来说)不是true/false返回。我需要它做的只是在ArrayList中添加/替换一个对象,而不是返回任
我目前正在学习Java的继承,我在理解它方面遇到了很大的困难,但是我不能理解的一个主要问题是为什么在下面的示例中有必要调用一个超类构造函数,它有什么帮助?此示例来自Oracle的方法教程。 我最初的想法是,会缩短当前构造函数中参数的代码,它只会接受父类中传入的值并将其添加到子类中(如下所示): 但是,正如我已经知道的那样,这是错误的,并且再次将我带到了真正做什么的问题上。我会非常感谢一些形式的解释
问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数