问题描述
这不应该是,11是好的,21是坏的吗?因为,在 i++ 的情况下,如果等于 i,则首先评估值 10,然后递增?
int i = 10;
if(i++ == i){
System.out.println(i + " is good");
}
else{
System.out.println(i + " is bad");
}
int j = 20;
if(++j == j){
System.out.println(j + " is good");
}
else{
System.out.println(j + " is bad");
}
输出:11 不好 21好
解决方法
@khelwood 的回答是正确的,就目前而言,但并没有真正按照要求告诉您前后增量“是什么”。
在具有此功能的语言中,包括 Java,都有“表达式”。 x + y
是一个表达式。 ++i
和 i++
也是如此。
表达式 ++i
的计算结果比表达式计算时 i
的值多 1。作为副作用,i
的值也会在计算表达式时设置为该值。
表达式 i++
的计算结果为计算表达式时 i 的值。作为副作用,i
的值会在表达式被计算之后递增。
这有一段我觉得有趣的历史;它在一定程度上解释了运算符存在的原因,尽管我认为它并不能真正帮助理解它,所以除非你对历史感兴趣,否则你可以跳过它。
C 语言是由贝尔实验室的几位工程师在由 Digital Equipment Corporation(即 DEC)制造的计算机上发明并首先实现的。这些是最早的一些小型计算机,早在个人计算机出现之前。在他们的一些模型的机器语言中,他们有通过将一些内部寄存器相加来访问内存的指令。他们构建了机器代码,以便其中一个寄存器可以在内存访问后递增,然后将其指向 NEXT 内存位置。
在当时的小型计算机世界中,执行速度和代码大小都很宝贵,因此能够以最少的指令和机器码的速度编写一个紧密的循环来遍历内存是可取的。因此,DEC 的计算机——包括他们非常流行的 PDP-11 系列——将前后递增和递减作为机器代码可以访问内存的“寻址模式”。
实现 C 的人希望利用 C 本身的这种机器级优势,C 一直是结构化汇编程序,而不是高级语言。所以这就是为什么该语言具有前后递增和递减,现在必须在每个支持该语言的编译器中实现。
,在 i++ == i
中,左侧计算结果为 10,增加 i
,右侧计算结果为 11,因为 i
已增加。所以等式是错误的。
在 ++j == j
中,左侧增加 j
并计算为 21,右侧计算为 21,因为 j
已增加。所以等式成立。
示例说明:
在后递增中,该值在评估后递增。当您在评估期间编写 i++
时,它首先使用 i 的先前值,即 10,但在评估 i++
后 i 现在等于11. 因此,在语句 if (i++==i)
中,它仅表示 if (10==11)
,这将返回 false。
在预递增中,值在评估之前递增。当你先写 ++i
时,我会增加到 21 然后它被使用。它与写 if(21==21)
相同,它会返回 true。
更好理解的新示例:
int i=10;
System.out.printf("Value of i during post-incrementing %d \n",i++);
System.out.printf("Value of i after post-incrementing %d \n",i);
System.out.printf("Value of i during pre-incrementing %d \n",++i);
System.out.printf("Value of i after pre-incrementing %d \n",i);
输出:
后递增 10 时 i 的值
后递增 11 后 i 的值
预增12时i的值
预增 12 后 i 的值