gpt4 book ai didi

java - Java 是否像 C++ 那样具有未定义的行为?

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:20 24 4
gpt4 key购买 nike

Undefined behavior and sequence points

上面的链接讲的是C++中的sequence point和side effect。

简而言之,就是在两个序列点之间,如果我们有多个副作用,则副作用的顺序是不确定的。

例如,

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

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

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

我的问题是,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 的“未定义行为”模型中删除了两个步骤;它严格规定了更多的行为,即使在行为不是严格定义的情况下,实现仍然限于从各种可能性中进行选择。除非使用 Unsafe 命名空间中的功能或将 Java 与外部语言链接起来,否则 Java 程序的行为将受到更多约束,即使使用此类构造,Java 程序仍将以 C 程序可能不会的方式遵守时间和因果关系的法则。

关于java - Java 是否像 C++ 那样具有未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39886415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com