操作数有自增操作时复合表达式的陷阱

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
请按任意键继续. . .
原文地址:https://www.cnblogs.com/youngforever/p/3232514.html