【问题标题】:Inconsistency in relationship between Java and CJava和C之间的关系不一致
【发布时间】:2014-09-24 19:15:07
【问题描述】:

如果我的问题看起来很幼稚,请原谅我。这是我在这里的第一个问题。

我脑子里有一个简单的问题。 Java 语言已使用 CC++ 实现。

我的问题是

在 C 语言中,C 的格式化行为未定义以供使用 不同于给定数据类型的修饰符。

int c=10;
printf("%f",c);    // unspecified behaviour

而在 Java 中,如果我们使用类似的概念来使用不同的格式说明符打印数字,我们会得到一个 IllegalFormatConversionExceptoion

异常详情:-

线程“main”中的异常 java.util.IllegalFormatConversionException: f != java.lang.Integer

我的问题是:-

为什么 Java 和 C 之间的差异如此之大,尽管 Java 是从 C 派生的!

请清除我的疑问。我会感谢你们的天才......

【问题讨论】:

  • 但是你的问题是什么?
  • 我认为更好的方法是,Java 使用异常处理来捕获或控制未定义的行为,而在 C 中我们没有异常处理的概念。
  • 是的,你会从 Java 中得到运行时错误,但不会从 C 中得到。另一方面,当你使用错误的格式说明符时,大多数现代 C 编译器都会给你一个编译时警告。
  • @juanchopanza-我认为这个问题很清楚。为什么 Java 和 C 之间的差异如此之大,尽管 Java 是从 C 派生的!另外,我没想到会收到很多反对票!好可怜!!!
  • @asad 您刚刚添加了对问题的说明。之前你所拥有的只是列出的事实和例子,没有任何实际问题,所以不清楚。

标签: java c exception format format-specifiers


【解决方案1】:

Java 中的printf 受C 中相同方法的启发,但工作方式完全不同。例如,如果你给它一个BigDecimal,即使 C 没有 BigDecimal,它也会打印它。

简而言之,Java 与 C 类似,并不意味着它使用相同的底层函数。在大多数情况下,Java 都有自己的实现来确保;

  • 定义的行为
  • 这与 Java 的使用方式一致。
  • 在所有操作系统平台上都一样。

为什么 Java 和 C 之间的差异如此之大,尽管 Java 是从 C 派生的

为什么不呢?为什么这会产生任何影响?

让我给你一个不同的例子。 “制造”的动词字面意思是人造的,但今天它几乎意味着相反的意思。仅仅因为一种语言源自另一种语言并不意味着它们必须相同。

【讨论】:

  • 虽然你的回答很好,但我想要一个更清楚的解释。你能更具体一点吗!
  • @asad 要给出明确/具体的答案,我需要一个明确/具体的问题。
  • 所以,具体的问题是---> java 是如何管理这个的,尽管 C 没有想到管理它!我猜 C 是基本的低级语言,因此提供的功能较少!但是,与 C 相比,Java 是现代的,所以它定制了我猜的变化!如果我错了,请随时纠正我!
  • 重复一遍,Java 中的printf 是用Java 编写的,原因我已经解释过了。它不是用 C 编写的。JVM 使用一些 C 来实现它,大多数 Java 运行时和工具都是用 Java 编写的
  • @asad 当 JVM 运行从字节码生成的机器码时,不涉及 C 或 C++。字节码到机器码的转换主要是在 C 中完成的,但是一旦生成了机器码,运行的 Java 代码和 CPU 之间就没有任何关系了。
【解决方案2】:

因为从历史上看,当格式说明符错误或缺少参数时,printf 函数会引起各种麻烦。因此,源自 C 的语言,特别是 C++ 和 Java,竭尽全力避免printf 问题。

同时,改进了 C 编译器以了解 printf 的工作原理,并在使用不正确时生成警告。因此,printf 问题在很大程度上不再存在(除非您忽略/禁用警告)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多