打印

++运算符在c语言与c++中有什么区别

[复制链接]
2682|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eleclike|  楼主 | 2008-5-24 20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先摆出两段代码:(仅后缀不同)
-------------------------------------------
1.test.c

#include <stdio.h>
void main()
{
    int a=3;
    (++a) += 1;
    printf("a=%d\n",a );

}
-------------------------------------------
2.test.cpp

#include <stdio.h>
void main()
{
    int a=3;
    (++a) += 1;
    printf("a=%d\n",a );

}
-------------------------------------------

上面两段代码内容是一样的,仅仅是后缀不同,都在VC6.0下编译调试,编译之后出现的不同的结果:
1.test.c:编译之后出现错误提示:“e:\vc\test\test.c(8) : error C2106: '+=' : left 

operand must be l-value”
2.test.cpp:编译无错误。

请问各位大虾,是不是在C++中重新对 ++ 运算符进行了重载导致了上述的差异?或者是其他什么原因?

相关帖子

沙发
平常人| | 2008-5-24 21:47 | 只看该作者

估计是VC的BUG

不管如何都应该通不过编译。

程序的运行结果是什么?

使用特权

评论回复
板凳
eleclike|  楼主 | 2008-5-24 22:09 | 只看该作者

test.cpp的运行结果是5

第2段程序test.cpp的运行结果是5,

使用特权

评论回复
地板
zhaoyu2005| | 2008-5-25 09:32 | 只看该作者

C的程序应该没问题的

应该能编译通过,并且运行结果也是5,这一点好像与C++没什么区别,但是在keil c51上确实没有编译通过,提示
CONTROLL.C(942): error C213: left side of asn-op not an lvalue
和楼主的意思差不多:好像是等号左边不是一个变量吧
这样看来,至少C的+=运算要求左边必须是变量,不能是表达式

使用特权

评论回复
5
HWM| | 2008-5-25 19:45 | 只看该作者

这是C++中的关于表达式的一个拓广(在C中非法),具体看下


class class_int
{
    public:

    int i;
    
    class_int& operator ++ ( void );
    class_int operator + ( class_int& x );
    class_int& operator = ( class_int x );
    class_int& operator += ( class_int& x );

    class_int ( void ) { i = 0; }
    class_int ( int x ) { i = x; }
};

class_int& class_int :: operator ++ ( void )
{
    i++;
    return *this;
}

class_int class_int :: operator + ( class_int& x )
{
    class_int temp;
    temp.i = i + x.i;
    return temp;
}

class_int& class_int :: operator = ( class_int x )
{
    i = x.i;
    return *this;
}

class_int& class_int :: operator += ( class_int& x )
{
    i += x.i;
    return *this;
}

int i,j;

class_int object_i;
class_int object_1( 1 );

int main(int argc, char* argv[])
{
    i = 3;
    (++i) += 1; // i <= 5

    i = 3;
    (++i) = (++i) + 1; // i <= 6

    i = 3;
    j = (++i) + 1;
    (++i) = j; // i <= 5

// 下面用对象来看其具体运算过程
    object_i.i = 3;
    (++object_i) += object_1; // object_i.i <= 5

    object_i.i = 3;
    (++object_i) = (++object_i) + object_1; // object_i.i <= 5

    return 0;
}

在上例中

    (++i) += 1; // i <= 5

    (++i) = (++i) + 1; // i <= 6

    j = (++i) + 1;
    (++i) = j; // i <= 5
是不一样的。

在第一个表达式中++运算符只用了一次,而在第二个表达式中++运算符用了两次,且优先使用。在第三个表达式组中,虽然++同样使用了两次,但第二次使用没有效果(结果被j覆盖了)。

最后附加了一组用类对象重载相关操作符后的表达式:

    object_i.i = 3;
    (++object_i) += object_1; // object_i.i <= 5

    object_i.i = 3;
    (++object_i) = (++object_i) + object_1; // object_i.i <= 5

由于重载后的操作符的使用优先顺序有所不同,具体为先等号右面,后左面,最后是等号。所以最后结果没有异常。

使用特权

评论回复
6
eleclike|  楼主 | 2008-5-26 10:44 | 只看该作者

谢谢楼上给出详解

谢谢楼上给出详解。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

201

帖子

0

粉丝