zoukankan      html  css  js  c++  java
  • 操作数有自增操作时复合表达式的陷阱

    2013-08-02 13:58:59

     最近看C++primer,发现一些细节,一直没搞清楚。

    5.5节 自增与自减操作符

    ++为自增,--为自减,这两种操作符都分别有前置与后置来两种形式,要搞清楚两种形式的差别。下面以自增操作符为例进行说明。

    前自增操作符是操作数加1,操作结果是修改后的值,返回的是对象本身,是左值

    后自增操作符同样对齐操作数加1,但是操作后产生操作数原来的,未经修改的值作为表达式的结果,返回的是右值

    测试如下:

    测试1:

    测试后自增结果作为左值

    (*ptr)++ += 10;

    因为(*ptr)++返回值为左值,

    编译报错:left operand must be l-value

    //测试表达复合式
    void TestCompoundAssignment()
    {
        int a[5]= {1,2,3,4,5};
    
        DisplayArray(a,5);
    
        int *ptr = a;
    
        (*ptr)++ += 10; //(*ptr)++返回值为左值,报错:left operand must be l-value
        cout<<*ptr<<endl;
        DisplayArray(a,5);
    }

    测试2

    测试前自增结果作为左值:

    ++(*ptr) += 10;

    等价于:

    ++(*ptr);

    *ptr += 10;

    //测试表达复合式
    void TestCompoundAssignment()
    {
        int a[5]= {1,2,3,4,5};
    
        DisplayArray(a,5);
    
        int *ptr = a;
    
        ++(*ptr) += 10; //(*ptr)++返回值为左值,报错:left operand must be l-value
        cout<<*ptr<<endl;
        DisplayArray(a,5);
    }

     运行结果:

    1       2       3       4       5
    12
    12      2       3       4       5
    请按任意键继续. . .

    C++primer 5.10 节讲到复合表达式求值,提到“一个表达式里不要在一个或更多的子表达式中对同一个对象做自增或自减操作”,因为其求值顺序不易把握,容易出错,下面给出了复合表达式中使用自增操作的例子,求值的顺序并不是每个人都能够正确把握的。

    下面是测试代码:

    测试1:

    *ptr++ += 10;

    等价于:

    *ptr += 10;
     ptr++;

    void TestCompoundAssignment()
    {
        int a[5]= {1,2,3,4,5};
    
        DisplayArray(a,5);
    
        int *ptr = a;
    
        *ptr++ += 10;
        //等价于
        /**ptr += 10;
        ptr++;*/
    
        cout<<*ptr<<endl;
        DisplayArray(a,5);
    }

    运行结果:

    1       2       3       4       5
    2
    11      2       3       4       5
    请按任意键继续. . .

    测试2:

    *ptr++ = *ptr++ + 10;

    等价于:

    *ptr += 10;
     ptr++;
     ptr++;

    //测试表达复合式
    void TestCompoundAssignment()
    {
        int a[5]= {1,2,3,4,5};
    
        DisplayArray(a,5);
    
        int *ptr = a;
    
        *ptr++ = *ptr++ + 10;  //在同一个语句中对同一对象做自增,结果与操作数的次序有关,
        //等价于
        /**ptr += 10;
        ptr++;
        ptr++;*/
    
        cout<<*ptr<<endl;
        DisplayArray(a,5);
    }

    运行结果:

    1       2       3       4       5
    3
    11      2       3       4       5
    请按任意键继续. . .
  • 相关阅读:
    运营是一个产品价值传递的过程,互联网营销 狼人:
    资深设计师Tony Ventrice解析手机游戏开发的四个层次 狼人:
    ubuntu 10.10下搭建android开发环境 安装必要工作用软件 狼人:
    iOS概述 狼人:
    关于Android的一些设计 狼人:
    企业中两个重要而又容易被忽视的角色,互联网营销 狼人:
    PySide教程:简单的对话框应用程序 狼人:
    PySide教程:PySide中使用Qt属性 狼人:
    网页的手机版本是否值得去做?,互联网营销 狼人:
    元素类型jQuery选择器
  • 原文地址:https://www.cnblogs.com/youngforever/p/3232514.html
Copyright © 2011-2022 走看看