Java 是否像 C++ 一样有未定义的行为?

2023-11-22

未定义的行为和序列点

上面的链接讨论的是C++中的序列点和副作用。

简而言之,这意味着在两个序列点之间,如果我们有多个副作用,则副作用的顺序是未指定的。

例如,

int x = 1;
int y = 2;
int z = x++ + y++;

我们可以确定的是z等于3。之后z得到 3,x and y会增加——有两个副作用,所以我们不知道哪一个先增加。

另外,上面的链接列出了各种序列点。

我的问题是,Java有完全相同的情况吗?我的意思是相同类型的序列点和相同的未定义行为?


与大多数其他流行语言相比,“现代”C 和 C++ 之间的主要区别在于,虽然其他语言允许编译器以未指定的方式在各种极端情况行为中进行选择,但 C 和 C++ 标准的作者并不想将语言限制在可以轻松满足任何类型行为保证的平台上。

给定一个如下结构:

int blah(int x)
{
  return x+10 > 20 ? x : 0;
}

Java 精确指定了 x 的所有值的行为,包括那些 这会导致整数环绕;早期 C 编译器的设计 二进制补码机器会产生相同的行为,除了机器 具有不同大小的“int”(16 位、36 位等)将在不同的位置换行 地方。使用其他整数表示形式的机器可能会表现出 然而,情况有所不同。

此外,即使对于“传统”C 编译器来说,这种情况也并不罕见。 表现得好像计算是在更长的类型上执行的。一些 机器有一些可以操作较长类型的指令,并且使用 这些指令和将值保留为更长的类型有时可能是 比将值截断/包装到“int”范围内便宜。在这样的 机器,像上面这样的函数产生结果也就不足为奇了 x 甚至对于溢出 10 以内的值。请注意,Java 会尝试 最大限度地减少实现之间的行为差​​异,因此不会 通常甚至允许这种程度的行为变化。

然而,现代 C 语言比 Java 又向前迈进了一步。它不仅允许 因为编译器可能会任意保留多余的精度 对于整数值,给定上述函数的现代编译器可能会 推断由于标准将允许编译器做任何事情 如果程序接收到的输入会导致函数接收到一个值 x 大于 INT_MAX-10,编译器应丢弃任何不相关的代码 如果未收到此类输入,则不会产生任何影响。净效应 这是整数溢出会破坏效果代码 以任意的方式。

因此,Java 与现代 C 的“未定义行为”模型相距两步; 它严格规定了更多的行为,甚至在行为不符合的情况下rigidly定义的实现仍然仅限于从各种可能性中进行选择。除非使用 Unsafe 命名空间中的功能或将 Java 与外部语言链接,否则 Java 程序的行为将受到更多限制,并且即使使用此类构造,Java 程序仍将遵守时间和因果关系的规律,而 C 程序可能不会。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 是否像 C++ 一样有未定义的行为? 的相关文章

随机推荐

  • 为什么 scala 不将该类型 lambda 与底层类型统一?

    trait A type T def test t T Unit case class B S lt A a S t S T def test a test t Error type mismatch found B this t type
  • nginx 500 错误,tmp 文件夹的权限被拒绝

    当我尝试上传照片时 我从 Django admin 得到了 500 当我检查 error log 时 我发现 2014 03 13 23 00 55 crit 16478 0 24 open var lib nginx tmp client
  • MVC4 Bundle 缩小不适用于 javascript 保留字

    使用最新版本的 MVC4 当 javascript 包含保留字作为键名时 我无法缩小 javascript 请参阅下面的错误 其中包含应已缩小的有效 JavaScript 有谁知道如何解决重写 javascript 以使用 表示法的问题 P
  • 使用 HtmlHelper.BeginForm() 是如何工作的?

    好的 我想知道如何
  • 是否可以通过 LKM 添加系统调用?

    我想通过 LKM 添加新的系统调用 但我不知道如何执行此操作 也就是说 我知道如果我想添加一个全新的系统调用 我可以查看sys call table并找到一个sys ni syscall然后替换它 但我很好奇是否真的有可能add to th
  • 从 ASP.NET 页面返回 JSON 对象

    在我的特殊情况下 我有几个解决方案来解决我的问题 我想知道哪一种更可行 在这种情况下 我还可以通过从服务器端代码返回 JSON 对象来实现我的目标 但是 我不知道它是如何完成的以及最好的方法是什么 首先 我不需要完整的 aspx 页面 因为
  • 为什么我的 cron 作业执行多次?

    我已经设置了一个需要每天执行一次的 cron 作业 但它会执行多次 我已经按照下面提到的方式设置了它 5 8 sh file path 谁能告诉我为什么会发生这种情况以及我应该做什么来解决这个问题 如果没有更多关于您的特定设置 系统的知识
  • 在Python中检测像素化图像

    我试图确定图像是否是平方的 像素化的 我听说过 numpy 或 scipy 的二维傅里叶变换 但它有点复杂 目标是确定由于压缩不良而产生的平方区域的数量 如下所示 img a 我不知道这是否可行 但是 您可以尝试的方法是获取像素周围最近的邻
  • 看似有效的 JSON 上的 JSON.parse 错误[重复]

    这个问题在这里已经有答案了 我在用着JSON parse 解析一个json这是从使用 jquery 调用的 api Laravel 5 返回的 get The json看似有效 然而JSON parse 在 Safari 和 Chrome
  • 将一个上下文中的 spring bean 替换为另一个上下文中的模拟版本

    我正在编写一个集成测试 其中应用程序上下文 xml 在启动期间初始化 测试类中有几个使用特定 bean X 已在 xml 中定义 的测试方法 我的实际要求是仅针对其中一种测试方法来模拟 bean X 在测试方法内部 我尝试使用 ClassP
  • GCP - 验证 PubSub 推送的云函数 https 端点的所有权

    很确定没有办法做到这一点 但很高兴联系看看其他人是否有任何想法 我想做的是 我有 2 个微服务作为云托管在 Google Cloud Platform 上 功能 我的第一个微服务执行任务并触发 PubSub 主题为 x 的消息 我想将我的第
  • 集合的位向量实现

    在阅读 aho 的数据结构书中有关集合基本操作的章节时 我在集合的位向量实现主题中遇到了以下行 if the universal set is sufficiently small so that a bit vector fits in
  • 如何缩小/剪切 Git 存储库

    我们有一个 Git 存储库 其中有 7 名贡献开发人员 拥有超过 2 5 年的历史和大约 10 000 次提交 我们使用 Assembla 进行推拉 当我们添加新的开发人员时 将存储库克隆到他们的开发计算机上需要将近一个小时 我不确定这是否
  • MySQL 触发器 - AFTER INSERT 触发器 + UDF sys_exec() 问题

    问题 我有一个保存某些记录的表 插入完成后 我想通过 MySQL 的 sys UDF 调用外部程序 php 脚本 现在 问题是我已将记录的 ID 传递给脚本的触发器 当我尝试通过脚本提取数据时 我得到 0 行 在我自己的测试中 我得出的结论
  • 为什么我的 Perl 就地脚本即使失败,也会以零退出代码退出?

    我有一个单行 Perl 搜索和替换 大致如下所示 perl p i e s foo bar non existent file txt 因为该文件不存在 这不是故意的 但这是自动构建脚本的一部分 所以我想防止这种情况发生 Perl 退出时出
  • 发布到 Facebook 后如何关闭弹出窗口?

    在我们的博客上 我们有一个链接 用户可以将我们的文章发布到他们的时间线 弹出窗口打开 用户向 Facebook 发帖 然后弹出窗口停留在那里并重定向到 www oursite com 当用户完成发布或单击取消按钮时 我们如何关闭弹出窗口 根
  • 使用 pip 安装软件包会返回错误[重复]

    这个问题在这里已经有答案了 不久前我从下载了 piphttps pip pypa io en stable installing 在我意识到我的 python 版本已经附带了 pip 之前 我成功地使用它来下载 pygame 但现在我尝试下
  • Swift 3:URLSession / URLRequest 不起作用

    我仍在尝试将我们的应用程序从 Swift 2 转换为 Swift 3 因为我们所有的 Apple 设备现在都运行 iOS 10 所以我被迫这样做 我已经完成了代码转换 并认为我做得很好 但是 在尝试调试我的 JSON 问题 发布在另一个问题
  • CodeIgniter:无法加载请求的文件:

    嗨 我是 codeigniter 的新手 我的网站可以在本地运行 但是当我上传时 出现以下错误 遇到错误 无法加载请求的文件 home home view php 这是我的控制器
  • Java 是否像 C++ 一样有未定义的行为?

    未定义的行为和序列点 上面的链接讨论的是C 中的序列点和副作用 简而言之 这意味着在两个序列点之间 如果我们有多个副作用 则副作用的顺序是未指定的 例如 int x 1 int y 2 int z x y 我们可以确定的是z等于3 之后z得