3 java
public class Static
{
static
{
int x = 5;
}
static int x,y;
public static void main(String args[])
{
x--; myMethod();
System.out.println(x + y + ++x);
}
public static void myMethod()
{
y = x++ + ++x;
}
}
Run Code Online (Sandbox Code Playgroud)
请问有人帮助我,为什么显示输出是3?
Mar*_*ers 13
static
{
int x = 5;
}
Run Code Online (Sandbox Code Playgroud)
您x在此重新声明,使其成为本地范围的变量(不是类成员).无论何时运行,此分配都不会产生任何影响.
现在,您询问了静态块,这就是我的答案.如果您对为什么输出值3的原因感到困惑,即使假设没有进行赋值,那么这也成为关于增量运算符(x++和++x)的问题.
我非常喜欢Paulo的解释,但让我们看看我们是否可以简化代码.首先,让我们忘记制作x和y静态字段(将它们设置为本地,初始化为静态int:0的默认值)和内联myMethod():
int x = 0, y = 0;
x--;
y = x++ + ++x;
System.out.println(x + y + ++x);
Run Code Online (Sandbox Code Playgroud)
首先,我们应该消除复杂的表达 我们可以通过以正确的顺序将每个子表达式提取到临时变量中来做到这一点(表达式从左到右评估):
int x = 0, y = 0;
x--;
int yOperand1 = x++;
int yOperand2 = ++x;
y = yOperand1 + yOperand2;
int resultOperand1 = x;
int resultOperand2 = y;
int resultOperand3 = ++x;
int result = resultOperand1 + resultOperand2 + resultOperand3;
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
现在,我们可以标记的价值x,y并在每个步骤中,任何临时变量:
int x = 0, y = 0; //x: 0 y: 0
x--; //x: -1 y: 0
int yOperand1 = x++; //x: 0 y: 0 yOperand1: -1
int yOperand2 = ++x; //x: 1 y: 0 yOperand1: -1 yOperand2: 1
y = yOperand1 + yOperand2; //x: 1 y: 0
int resultOperand1 = x; //x: 1 y: 0 resultOperand1: 1
int resultOperand2 = y; //x: 1 resultOperand1: 1 resultOperand2: 0
int resultOperand3 = ++x; //x: 2 resultOperand1: 1 resultOperand2: 0 resultOperand3: 2
int result = resultOperand1 + resultOperand2 + resultOperand3; //result: 3
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
您的静态块有一个名为的局部变量x,它不会更改具有相同名称的静态变量.
通常,static { ... }块将由编译器按照它们在代码中的顺序与静态变量的初始化程序合并,并在类初始化时执行.(在字节码中,这是一种静态<clinit>方法.)
在您的程序中会发生以下情况:
x并y使用其默认值(0)进行初始化.x = -1.myMethod().
myMethod将两次递增x(从-1到0到1),并设置y为0(第一次递增前的值+第二次递增后的值).x(1),y(0)和x再次增加(2)之后的值,并打印结果(3).