首页 > 试题广场 >

What will happen when you atte

[单选题]
下面代码运行结果是?
public class Test{
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;
 }
}

  • compiletime error
  • prints:1
  • prints:2
  • prints:3
  • prints:7
  • prints:8
推荐
D
1.静态语句块中x为局部变量,不影响静态变量x的值
2.x和y为静态变量,默认初始值为0,属于当前类,其值得改变会影响整个类运行。
3.java中自增操作非原子性的 
main方法中:
  • 执行x--后 x=-1
  • 调用myMethod方法,x执行x++结果为-1(后++),但x=0,++x结果1,x=1 ,则y=0
  • x+y+ ++x,先执行x+y,结果为1,执行++x结果为2,得到最终结果为3
编辑于 2015-02-04 11:51:57 回复(60)
D.1.JVM加载class文件时,就会执行静态代码块,静态代码块中初始化了一个变量x并初始化为5,由于该变量是个局部变量,静态代码快执行完后变被释放。
2.申明了两个静态成员变量x,y,并没有赋初值,会有默认出值,int类型为0,
3.执行x--操作,变量单独进行自增或自减操作x--和--x的效果一样,此时x变为了-1
4.调用MyMethod()方法,在该方法中对x和y进行计算,由于x和y都是静态成员变量,所以在整个类的生命周期内的x和y都是同一个
5.y=x++ + ++x可以看成是y=(x++)+(++x),当++或者--和其它变量进行运算时,x++表示先运算,再自增,++x表示先自增再参与运算
所以就时x为-1参与运算,然后自增,x此时为0,++x后x为1,然后参与运算,那么y=-1+1就为0,此时x为1
6.执行并打印x+y + ++x运算方式和第5步相同,最后计算结果就为3.

发表于 2015-08-26 16:16:37 回复(58)
在静态代码块内执行后
static{
intx=5;
}
这个局部x变量就已销毁,类变量staticintx,y;会伴随着程序中的自增自减操作影响自身的值,它们会有初始化值0,而只要清楚x++和++x的区别就行了,前者是先运算后赋值,后者是先赋值后运算。
在程序中x--;之后x=-1,调用方法myMethod( )时,y=x++ + ++x;相当于y=-1+1,所以y=0,
这个地方的第一个x++在参与运算的时候是没有赋值的,所以为-1,
第二个++x的时候在先执行++操作前要注意此时x实际为0,因为前面的x++改变了x自身的值,所以++x后为1.在后面的运算中x+y+ ++x,根据规则相当于:1+0+2=3 因为此时的++x在后面,所以第一个x的值没有改变。
编辑于 2019-06-10 21:08:44 回复(7)
1、静态语句块中的x为局部变量,与static int x的值无关。
2、x与y为静态变量,没有初始化的值为0。
3、main中:x--;此时x = -1
4、调用method()方法 y = (x++) + (++x);  x++表示先进行运算,再自增,也就是(x++)这个表达式整体值为-1,而x的值为0,(++x)表示先自增,再运算,也就是x为1,表达式整体值也为1,所以y = -1 + 1 = 0
5、x + y + (++x) = 1 + 0 + 2 = 3
发表于 2016-08-23 01:42:42 回复(0)
static{
   intx=5;  //当加载静态代码块的时候,会执行这句话。但,注意, int x=5; 这里声明的是局部变量x,
}
//不是类的成员变量,它的生命周期就是在代码块内,出了代码块,就销毁了。
staticintx,y;初始都为0
x--; -1
y=x++ + ++x; -1 + 1=0
System.out.println(x+y+ ++x); 1+0+2=3
发表于 2016-03-20 21:34:48 回复(1)
其实我很想说,我要是老板,谁要是这么写代码我就扣他俩月工资
发表于 2016-04-07 22:42:06 回复(2)
此题中静态代码快中又重新定义了一个x,这个x是局部变量。
体会如下两块代码:
public class TestStatic{
	static int x = 0;
	static{
		int x = 9;
	}
	
	public static void main(String[] args){
		System.out.println(x);
	}
}
以上输出 0
===============================================================
public class TestStatic{
	static int x = 0;
	static{
		x = 9;
	}
	
	public static void main(String[] args){
		System.out.println(x);
	}
} 以上输出 9

发表于 2015-09-26 14:28:25 回复(10)
静态代码块中的x为局部变量。题中用到的是局部静态变量x。默认的x为0
答案为3
发表于 2015-07-25 14:49:45 回复(0)
System.out.println(x+y+ ++x);这句话,有人考虑过参数的入栈顺序么?为啥不是从后往前计算呢?
C++中是先计算++x,从后往前计算的。
顶我上去,求解答~
发表于 2018-03-04 21:38:43 回复(4)
y=(x++)+(++x)
第一个x,出了括号之后,会变成0
第二个x,会先自增,变成1
而第一个x是先运算,再自增
第二个是先自增,在运算。
所以是,y=-1+1=0
发表于 2017-07-28 14:06:29 回复(0)
能否有人告诉我,,为何System.out.println(x+y+ ++x)这句话  不是先执行++x再执行 x+y。 ++操作优先级不是更高一点吗
发表于 2018-04-03 18:52:43 回复(3)
此题注意静态代码块中变量是局部变量就行了,然后知道中缀表达式就好了!Java的中运算表达式都是中缀表达式,例如x+y的中缀表达式为xy+,显然编译的时候会先取操作数,所以题目中会先去x,紧接着会弹出++操作符,所以会自增,然后取操作数,发现右操作数也有一元运算符,所以也会自增,最后弹出最后的加号
发表于 2017-08-02 14:48:42 回复(0)
在static静态代码块中的赋值只是一个干扰项;
1,在main方法中x--后,x的值为-1;
2,然后调用myMethod方法,y = x++ + ++x; 当参与运算时x++是先运算后自增,所以就等同于y = -1 + 1;(后边也是1是因为到++x时已经完成了一次自增,只是不参与运算而已),所以y=0;x=1;   
3,调完myMethod方法后,在主函数中执行输出语句:x+y+ ++x   :x+y = 1;++x = 2;  相加就等于3.
选D
发表于 2015-11-09 19:16:05 回复(0)
 y=x++ + ++x;结合性不是从右到左的吗,为什么先计算x++?

发表于 2015-08-11 23:37:14 回复(5)
1. 首先static代码块中的int x的x为局部变量
2. int类型的变量未初始化默认为0,所以 x = y= 0
3. 执行顺序为:

  • L7:x--; x变为-1
  • L12:y = x++ + ++x; 可以分为以下几个步骤

            1. x++; 这行结束时x才自增变为0,所以 L12 运算时左侧x依旧为 -1; 
            2. ++x; 接上面1后,++x是在开始时自增,0 + 1 = 1;所以 L12 运算时右侧为 1
            3. y = (x++) + (++x) = -1 + 1 = 0
  • L9:x + y + (++x) 又分为以下几个步骤
            1. x + y = 1 + 0 = 1
            2. ++x; 1 + 1 = 2
            3. x + y + (++x) = 1 + 2 = 3
发表于 2022-03-09 15:06:27 回复(0)
wkb头像 wkb
static{
intx=5;
}这种叫做局部变量,局部变量,局部变量
static int x,y; 这种叫做静态变量,静态变量,静态变量
x=5 ;x++=5;x=6 这个要记住!!
编辑于 2017-09-07 19:51:17 回复(0)
为什么我用eclipse一模一样敲出来答案是2
编辑于 2017-05-14 20:39:22 回复(1)
这篇文章详细解析了java自加的原理
http://blog.csdn.net/qq523786283/article/details/58612990
发表于 2017-02-28 18:42:48 回复(0)
不要被静态代码块迷惑
发表于 2015-09-09 16:44:50 回复(0)
1.静态语句块中x为局部变量,不影响静态变量x的值
2.x--; 此时的x = -1;此时x的值已经改变
3.y=x++ + ++x; 先理解 y = x++;等价于 y= x;x=x+1这样的先后顺序。所以前面的算法就变成了 y= x(原 -1) + x(变化后 1);x的变化 (1)x++->x+1=0,(2)++x->1+x = 1; 所以 y=x++ + ++x -> y= -1 + 1; x= 1;  所以 调用MyMethod()方法 后 y=0 x=1;
4. x+y+ ++x -> x(原) + y + x(变化后) ; x 的变化 ++x -> 1+x = 2; 所以等式为 1 + 0 + 2 = 3
发表于 2021-01-07 16:31:46 回复(0)
静态代码块里的是int x=5      而非x=5;刷题特有幻视,建议仔细读题
发表于 2020-08-04 22:05:22 回复(0)