par*_*ain 35 c c++ java operators
在C中编译并运行此代码
#include <stdio.h>
int main()
{
int a[] = {10, 20, 30, 40, 50};
int index = 2;
int i;
a[index++] = index = index + 2;
for(i = 0; i <= 4; i++)
printf("%d\n", a[i]);
}
Run Code Online (Sandbox Code Playgroud)
输出: 10 20 4 40 50
现在用于Java中的相同逻辑
class Check
{
public static void main(String[] ar)
{
int a[] = {10, 20, 30, 40, 50};
int index = 2;
a[index++] = index = index + 2;
for(int i = 0; i <= 4; i++)
System.out.println(a[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
输出: 10 20 5 40 50
为什么两种语言都有输出差异,输出可以理解,Java但我无法理解输出C
还有一件事,如果我们应用前缀++运算符,我们在两种语言中得到相同的结果,为什么?
Pra*_*rav 64
那是因为a[index++] = index = index + 2;在C中调用未定义的行为.看看这个
从链接:
第二句话说:如果一个对象被写入一个完整的表达式,那么在同一个表达式中对它的任何和所有访问都必须直接参与计算要写入的值.此规则有效地将法律表达式约束为在修改之前明显存在访问的表达式.例如,允许旧备用i = i + 1,因为i的访问用于确定i的最终值.这个例子
Run Code Online (Sandbox Code Playgroud)a[i] = i++是不允许的,因为i 的一个访问(a [i]中的一个)与最终存储在i中的值无关(在i ++中发生),所以没有好的方法来定义 -要么是我们的理解,要么是编译器 - 是否应该在存储增量值之前或之后进行访问.由于没有好的方法来定义它,标准声明它是未定义的,并且可移植程序根本不能使用这样的结构.与
a[i++]=i(调用UB)类似,您的表达式也会调用UB.
您的表达式也有类似的行为.
行为定义明确Java.