考虑一下代码段:
int a = 1, b = 1, c = 1;
System.out.println(a + ++a);
System.out.println(b++ + ++b);
System.out.println(c++ + c);
输出结果为:
3
4
3
这就是我认为正在发生的事情,但输出并不匹配:
1. ++a -> +a -> 4 = 2 + 2
2. ++b -> +b -> 4 = 2 + 2
3. c -> +c -> 2 = 1 + 1
答案 0 :(得分:8)
一元邮政和预增量的优先级高于加法:
b = 1
,b
初始化为1。b++
,b
'等式中的当前值为1,然后b
递增。++b
,b
由于后递增而递增,所以它是2.现在它由于预增量而再次递增,并且它在等式中的值是3。1 + 3
是4。问题是,预增量增加变量,然后将其返回,因此在++1
中,值递增,然后返回,并计算为2。递增,返回变量值,然后递增。因此1++
将评估为1,然后在以后引用时增加到2。所以:
b++ + ++b ^^^ post-increment, evaluates to 1
1 + ++b ^^^ pre-increment, due to post-increment is 2, then pre-increments and evaluates to 3
1 + 3 ^^^^^ evaluates to 4
这也适用于第一和第三个例子。对于a + ++a
,++a
具有更高的优先级。首先,计算a
,此时为1,然后评估++a
,因为它具有更高的优先级,其中a
递增,然后值返回并计算为2。 ,评估添加,如下所示:
a + ++a ^ nothing, evaluates to 1
1 + ++a ^^^ pre-increment, evaluates to 2
1 + 2 ^^^^^ evaluates to 3
在第三个示例中,c++ + c
,c
后递增,因此它的计算结果为1,然后递增。最后c
是2,看起来像这样:
c++ + c ^^^ post-increment, evaluates to 1
1 + c ^ nothing, due to post-increment is 2 and evaluates to 2
1 + 2 ^^^^^ evaluates to 3
因此输出:
3
4
3
应该注意,优先权并不决定评估顺序。优先级仅更改表达式的括号。 Java中的评估顺序始终从左到右为ajb comments,与C / C ++不同,请参阅JLS 15.7。
答案 1 :(得分:2)
众所周知,x++
和++x
以不同的方式做同样的事情。 x++
返回该值,然后递增。 ++x
递增值,然后返回它。
良好的逻辑,但你忘记了一些事情。
首先,您取a
,即1,然后将其添加到++a
。前面的++会使它从1增加到2,而等式现在是1 + 2
。那是三个。
您选择b++
。 b
之前是{1},因为你把++放在后面,它给方程的其余部分提供了初始值1,然后将变量增加到2.但你忘记了即使值我们从b++
获得的是1,在内存中,b
现在是2.由于b是2,下一部分++b
将返回3.
同样的错误发生在第3部分。 c
返回1,然后递增到2。然后你将{1}添加到c
,现在增加了1,因为你增加了它,你得到3。
所以发生了什么:
a:1 + 2 = 3
b:1 + 3 = 4
c:1 + 2 = 3
答案 2 :(得分:1)
a++
评估为a,然后递增a。 ++a
首先递增a,然后返回a。
从http://introcs.cs.princeton.edu/java/11precedence/的运算符优先级图表中,您可以看到添加工作从左到右。
浏览每个示例,其中每个变量从1开始:
a + ++a
:a
被添加到a
,加1。这给我们1 + 2(3)。
b++ + ++b
:b
之前它增加后会在b
增加b++
之后添加到++b
之后#&} 39; s递增c++ + c
。这给了我们1 + 3(4)。
c
:c
在递增之后会在递增后添加到rows=tdf.values.tolist()
cursor.execute('select * from job_req_t where rownum <1')
db_types = (ele[1] for ele in cursor.description)
cursor.setinputsizes(*db_types)# to avoid hard coding
cursor.bindarraysize = 200
insertstmt2='''
INSERT INTO job_req_t (ID,col2,col3,col4lco5,col6,col7 )VALUES (:1,:2,:3,:4,:5,:6,:7)
'''
cursor.prepare(insertstmt2)
cursor.executemany(None,rows)
,给出1 + 2(3)。