`
tuojian.tj
  • 浏览: 19517 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

java与C++中的后置自增操作符++

阅读更多
在前置自增与后置自增操作中,当属后者最为麻烦。

某书中有一道简单的题目
如下几行 Java 代码:
import java.util.*;
public class Text{
    public static void main(String[] args){
        int j = 0;
        for(int i = 0; i < 100; i++)
            j = j++;
        System.out.println(j);
    }
}

执行结果是多少? 我当时写了两个答案:0,100.
第一个答案:0 是因为对于后置++操作符,号称用了中间缓存变量机制,其实内部实现大致如下
temp = j;
j = j + 1;
j = temp;

第二个答案:100,
为什么呢?请看以下一段C++代码
#include <iostream>
using namespace std;
int main()
{
    int j = 0;
    for(int i = 0; i < 100; i++)
        j = j++;

    cout << j << endl;
    return 0;
}
结果是就是100。

难道C++就没有中间缓存变量机制?当然不是。

导致Java和C++在这方面的区别的原因不在机制本身,而在于编译器的问题。在C++中,后置自增同样会比前置自增多了一份中间缓存的工作。但是请注意,在C++中,一些基本类型如int,double以及指针类型,在进行后置自增操作的时候,编译器将会为这些类型省去中间缓存变量的操作,采取其它方式(我猜是直接按照优先级拆分代码)。

所以在这方面,Java与C++显得有点不同,或者性能与C++显得不足。我是这样评估的,在Java中前置自增的性能总是要比后置自增性能要好(没有缓存变量赋值);C++中大部分也是这样,但是如果是对基本类型和指针进行后置自增操作,那么性能将和前置自增一样。

但是一般不建议在复合语句中使用后置自增,尽量用前置自增。因为在后置自增中,C++只保证自增在所在语句执行后进行自增,却没有保证在什么时候自增(虽然几乎所有的都是在当前语句执行完之后马上自增,但是据我所知,C++并没有提供这方面的保证,这是一个令人惊讶的现实)
分享到:
评论

相关推荐

    前置自增 ++i 与后置自增 i++ 的区别及应用

    后置自增操作符(`i++`)则与前置自增相对,它在返回变量`i`当前的值后,再将`i`的值增加1。这表示在表达式的其他部分使用该变量之前,`i`的值实际上是不变的。后置自增的优先级相对较低,它的操作会推迟自增值的...

    java中的自增问题介绍

    在Java编程语言中,自增操作符(++)和后置自增操作符(i++)的行为可能会引发一些初学者的困惑。这个问题通常涉及到变量的值如何在内存中被更新,以及Java虚拟机(JVM)如何处理这些操作。本文将深入探讨Java中的...

    2021-2022计算机二级等级考试试题及答案No.19468.docx

    2. 在C或类似的编程语言中,`x++`和`y++`是后置自增操作符,意味着它们在表达式求值后才会增加变量的值,而`++x`和`++y`是前置自增操作符,会在表达式求值前增加变量的值。因此,`x++=y++`这样的赋值操作是不合法的...

    java习题集.pdf

    10. 算术右移操作符:在Java中,算术右移操作符是`&gt;&gt;&gt;`,所以A、B和D选项都是错误的。 11. 数据类型赋值:Java中,浮点数不能直接赋值给浮点型变量,需要加小数点或指数形式。因此,A选项是非法的,而B、C和D选项是...

    运算符优先级.docx

    - 最高优先级通常赋予单目运算符,包括前置和后置自增/自减(`++`、`--`)、一元操作符(`+`、`-`、`~`、`!`)。 - 接下来是算术运算符,包括乘法、除法、求余数(`*`、`/`、`%`)、加法和减法(`+`、`-`)。 - ...

    Java运算符Java运算符Java运算符Java运算符Java运算符

    Java中的取模运算符与C/C++中的不同之处在于,当其中一个操作数为负数时,结果也会有所不同。例如: ```java class Modulus { public static void main(String args[]) { int x = 42; double y = 42.25; System...

    JAVA学习总结.pdf

    - 自增操作符`++`在Java中与C/C++类似,有前置和后置两种形式。 **5. 移位运算符** - 左移`将二进制位向左移动指定的位数。 - 带符号右移`&gt;&gt;`:符号位不变,其余位向右移动。 - 无符号右移`&gt;&gt;&gt;`:所有位向右移动,...

    2021-2022计算机二级等级考试试题及答案No.19685.docx

    5. **SQL 语句**:在 SQL 查询中,UNION 操作符用于合并两个或多个 SELECT 语句的结果集。正确答案 D 合并了两个查询,且保持了 SQL 语句的正确语法。 6. **随机数生成**:在 VBScript 或 VBA 中,生成 [10, 50] ...

    《JAVA语言程序设计》期末考试试题及答案(word文档良心出品).doc

    - 表达式 `( x + + )/3` 中,`+ +` 是后置自增运算符,表示先使用变量的值,然后将变量值加1。因此,这里的 `x` 值仍为 `2`,所以 `2 / 3` 的结果为 `0`。 **4. 若 `x = 5`,`y = 10`,则 `x 和 `x &gt;= y` 的逻辑...

    Go语言 知识点

    Go语言中的自增操作符与C语言家族中的大多数语言有所不同,不允许作为表达式使用。因此,像`j = i++`这样的语句是非法的,并且只能后置使用,即`i++`。同样的规则适用于自减操作符,不允许前缀形式如`--i`。 ##### ...

    C++习题frefsefsefse.pdf

    根据提供的文件信息,我们可以从中提炼出一系列与计算机科学和C++编程相关的知识点。接下来,我将逐一解析并扩展这些知识点。 ### 计算机程序设计语言的发展历程 1. **机器语言**:早期计算机只能理解由0和1组成的...

    〖程序设计基础〗练习题3及答案.docx

    1. **编程语言分类**:第1题指出编程语言可以分为面向过程和面向对象的,而题目中的C选项指的是编译型、面向过程的高级语言,如C或C++。 2. **变量定义**:第2题指出,变量定义的错误方式,如B选项的空缺值和D选项...

Global site tag (gtag.js) - Google Analytics