Java 一个变量在一条语句中可以递增多少次?
我目前正在阅读Barry Burd的Java For Dummies,偶然发现了这个小练习 这项工作是关于员额和增额前的。在这个问题(请看代码)中,我能够找出所有行的答案(没有编译器的帮助),除了最后一行。根据我目前对增量后/增量前的了解,这是没有意义的 请告知结果与我预期不符的方式或原因 我尝试初始化并声明一个值为“20”的新变量(int),然后执行“I=I+++I++”,但仍然收到相同的结果(41) 也试了两次,但还是打印了41Java 一个变量在一条语句中可以递增多少次?,java,increment,post-increment,pre-increment,Java,Increment,Post Increment,Pre Increment,我目前正在阅读Barry Burd的Java For Dummies,偶然发现了这个小练习 这项工作是关于员额和增额前的。在这个问题(请看代码)中,我能够找出所有行的答案(没有编译器的帮助),除了最后一行。根据我目前对增量后/增量前的了解,这是没有意义的 请告知结果与我预期不符的方式或原因 我尝试初始化并声明一个值为“20”的新变量(int),然后执行“I=I+++I++”,但仍然收到相同的结果(41) 也试了两次,但还是打印了41 import static java.lang.System.
import static java.lang.System.out;
public class Main
{
public static void main(String[] args) {
int i = 10;
out.println(i++); //10(post11)
out.println(--i); //10(pre11-1)
--i; //9(pre10-1)
i--; //9(post8)
out.println(i); //8
out.println(++i); //9(pre8+1)
out.println(i--); //9(post8)
out.println(i); //8
i++; //8(post9)
i = i++ + ++i; //i = 9(post10) + 10(pre9+1) = 19(post20)
out.println(i); //20
i = i++ + i++; //i = 20(post21) + 20(post21) = 40(post42)
out.println(i); //41 (result copied from compiler)
}
}
我希望最后一行打印42而不是41,因为“20”会被添加两次,也会被增加两次
i = i++ + i++
计算结果为(如果我是20岁):
因为第一个i++
是一个post操作符,所以不影响它。但是,它确实会影响i
的下一次使用
我会一步一步地把它分解:
i=
i++
+i++代码>,i==20
i=
20
+i++
,i==21
i=20+
i++
,i==21
i=20+
21
,i==22
i=
41
计算结果为(如果我是20岁):
因为第一个i++
是一个post操作符,所以不影响它。但是,它确实会影响i
的下一次使用
我会一步一步地把它分解:
i=
i++
+i++代码>,i==20
i=
20
+i++
,i==21
i=20+
i++
,i==21
i=20+
21
,i==22
i=
41
使用赋值运算符(=)时,它是在增量后运算符之后完成的。因此,您可以得到:
int i = 10;
i = i++;
System.out.println(i); // print 10
在同一行中使用两次后增量时,它不会在行完成后增加,而是在指令完成后增加(指令为i++)。因此,当执行i=i+++i++;事实上,您正在这样做:
i = i++ + i++; // i=20 Original code
i = 20 + i++; // i=21 The first i++ return 20 then increment i to 21
i = 20 + 21; // i=22 The second i++ return 21 then increment i to 22
i = 41; // i=22 The addition is computed
41; // i=41 and assigne to i
这一切都与运算符优先级有关。使用赋值运算符(=)时,它是在增量后运算符之后完成的。因此,您可以得到:
int i = 10;
i = i++;
System.out.println(i); // print 10
在同一行中使用两次后增量时,它不会在行完成后增加,而是在指令完成后增加(指令为i++)。因此,当执行i=i+++i++;事实上,您正在这样做:
i = i++ + i++; // i=20 Original code
i = 20 + i++; // i=21 The first i++ return 20 then increment i to 21
i = 20 + 21; // i=22 The second i++ return 21 then increment i to 22
i = 41; // i=22 The addition is computed
41; // i=41 and assigne to i
这一切都与运算符优先级有关。您可以通过编写自己的打印例程来查看发生了什么
inti=9;
i=打印(i++)+打印(+i);//i=9(后10)+10(前9+1)=19(后20)
System.out.println(“\n”+i);//20
i=打印(i++)+打印(i++);//i=20(后21)+20(后21)=40(后42)
System.out.println(“\n”+i);//41(从编译器复制的结果)
公共静态整数打印(整数i){
系统输出打印(“i=“+i+”);
返回i;
}
通过编写自己的打印例程,您可以看到发生了什么
inti=9;
i=打印(i++)+打印(+i);//i=9(后10)+10(前9+1)=19(后20)
System.out.println(“\n”+i);//20
i=打印(i++)+打印(i++);//i=20(后21)+20(后21)=40(后42)
System.out.println(“\n”+i);//41(从编译器复制的结果)
公共静态整数打印(整数i){
系统输出打印(“i=“+i+”);
返回i;
}
FWIW,我认为在同一语句中,将增量后/增量前运算符与其他运算符(如加法和赋值)相结合是一种讨厌的做法。FWIW,我相信将Pr/Pro增量运算符与其他操作符(如在同一语句中的加法和赋值)相结合是一个讨厌的问题。您可以明确地概述如何逐个评估每个<代码> I++<代码>,从而得到“相同表达式”的两个不同值。.非常感谢您花时间回答这个问题,尽管它仍然令人费解,但相对来说更有意义。我不能得到的部分是“i”是如何变成“22”的。<代码> i <代码>在第二个后增量受到影响时变成22。您可以明确概述如何逐个评估每个<代码> I++<代码>,以产生“相同表达式”的两个不同值。非常感谢您花时间回答这个问题,虽然这仍然令人费解,但相对来说更有意义。我无法理解的是,当第二个post增量生效时,“I”是如何变成“22”的。I
变成了22。非常感谢您回答这个问题,所以我的理解是,无论在同一行中使用了多少次post增量,该值都会继续传递到下一个“I++”,基本上是第一个“I++”由于传递在同一行中的最后一个操作之后结束,因此不会递增。另外,请解释一下我变成“22”的部分。很抱歉给您带来不便。i++刚返回其当前值,i就递增了。因此,它第一次在线路上返回20,变成21。第二次上线时,它返回21,然后变成22。在此之后,加法被计算(20+21)并分配给I,I变成了41。非常感谢您回答这个问题,所以我的理解是,无论在同一行中使用了多少次后增量,该值都会继续传递给下一个“I++”,基本上是第一个“I++”不会增加,因为传递在同一组中的最后一个操作之后结束