Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个变量在一条语句中可以递增多少次?_Java_Increment_Post Increment_Pre Increment - Fatal编程技术网

Java 一个变量在一条语句中可以递增多少次?

Java 一个变量在一条语句中可以递增多少次?,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.

我目前正在阅读Barry Burd的Java For Dummies,偶然发现了这个小练习

这项工作是关于员额和增额前的。在这个问题(请看代码)中,我能够找出所有行的答案(没有编译器的帮助),除了最后一行。根据我目前对增量后/增量前的了解,这是没有意义的

请告知结果与我预期不符的方式或原因

我尝试初始化并声明一个值为“20”的新变量(int),然后执行“I=I+++I++”,但仍然收到相同的结果(41)

也试了两次,但还是打印了41

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++”不会增加,因为传递在同一组中的最后一个操作之后结束