注册 登录
编程论坛 C++教室

增量运算

zhanghang123 发布于 2010-12-15 13:28, 1463 次点击
程序代码:
#include<iostream.h>
int main()
{
    int a=1,b,c,d,e;

    b=(++a)+(++a)+(++a);
    cout<<"b="<<b<<endl
        <<a<<endl;
    c=(a++)+(a++)+(a++);

    cout<<"c="<<c<<endl
        <<a;
    return 0;
}
运行结果:b=10,不理解,哪位高手给解释一下?
12 回复
#2
laoyang1032010-12-15 17:33
程序代码:
#include<iostream.h>
int main()
{
    int a=1,b,c;
    b=(++a);
    b+=(++a);
    b+=(++a);
    cout<<"b="<<b<<endl
        <<a<<endl;
    c=(a++)+(a++)+(a++);

    cout<<"c="<<c<<endl
        <<a;
    return 0;
}
这样就变成9了   呵呵  编译器问题................
#3
angelpaiy2010-12-15 17:53
回复 楼主 zhanghang123
这个怎么看都像等9哦
#4
laoyang1032010-12-15 17:59
呵呵   下面的确实是9   但是上面的那个为什么是10  我也解释不了.......

这样的问题与编译器有关  不必深究
#5
angelpaiy2010-12-15 18:01
哦哦,了解了解,路过看看,呵呵
#6
zhanghang1232010-12-15 23:28
回复 2楼 laoyang103
恩,我也觉得应该是9。呵呵……
#7
danpandong2010-12-16 10:56
这种问题没有必要深究,没有什么用。
#8
xishui7772010-12-16 12:33
学习下
#9
懂也不懂2010-12-16 13:05
这个跟编译器有关,在vs2008里,他是默认括号优先级较高,所以他会先将b=(++a)+(++a)+(++a)里的三个括号运算先算了,即a=4;然后再加起来即4+4+4=b=12;哈哈
#10
八画小子2010-12-16 13:20
多注意一下,之前其实我们讨论过,这个问题的回复看相关贴子
在讨论递增操作符之前先说明几个概念,之后会用到。
    1、顺序点:程序执行过程中的一个点。在这里,进入下一步之前将确保对所有的副作用都进行了评估。在C++中,语句中的分号就是一个顺序点,这意味着程序处理下一句语句之前,赋值操作符、递增操作符和递减操作符等执行的修改都必须完成。另外,任何完整表达式末尾都是一个顺序点。
    2、副作用:在计算表达式时对某些东西(如存储在变量中的值)进行了修改,这种现象称为该表达式具有副作用。
    3、完整表达式:它是这样一个表达式,不是另一个更大表达式的子表达式。完整表达式的例子有:表达式语句中的表达式部分以及用作while循环中的检测条件的表达式。
    下面正式讨论一下递增操作符:
    1、递增操作符有两个版本:前缀版本和后缀版本。
    2、前缀递增操作符、前缀递减操作符和解除引用操作符的优先级相同,都以从右往左的方式进行结合。后缀递增操作符、后缀递减操作符的优先级相同,但比前缀版本的操作符的优先级高,这两个操作符以从左往右的方式进行结合。
    3、对于一个语句中各表达式均使用完整表达式时,使用递增操作符的前缀版本和后缀版本,两者的最终效果在数值方面没有任何区别。表达式的值未被使用,因此只存在副作用。但是两者的执行速度可能有细微的差别。对于内置类型和当代编译器而言,这看似不是什么   问题。然而C++允许程序员针对类定义这些操作符。对于后缀版本首先复制一个拷贝,将其加1,然后将复制的拷贝返回。因此,前缀版本的效率比后缀版本的效率要高。
    4、在语句
           while (guests++ < 10)
               cout << guests;
       中表达式guests++ < 10 是一条完整表达式,因为它是一个while循环的测试条件,因此该表达式的末尾是一个顺序点。所以,C++确保副作用(将guests加1)在程序进入cout << guests之前完成。然后通过递增操作符后缀版本,可确保将guests同10进行比较后再将其值加1.
在语句
           y = (4 + x++) + (6 + x++);
       中表达式 4 + x++ 不是一个完整表达式。因此,C++不保证x的值在计算子表达式 4 + x++ 后立刻增加1。在这个语句中,整条赋值语句时一个完整表达式,而分号标示了顺序点,因此C++只保证程序执行到下一条语句之前,x的值将被递增两次。C++没有规定是在计算每个子表达式之后将x的值递增,还是在整个表达式计算完毕后才将x的值递增。

这些东西是本人自己通过查阅一些材料,自己总结的。如果有人发现有错误请后面跟帖说明。
希望看到这个贴的朋友,可以加入QQ群125978818,这个群主要针对C++初学者。在群中,我会不定期上传类似文章和大家一起讨论。
#11
kittel2010-12-16 17:42
回复 9楼 懂也不懂
别人结果是10好不好 不是12
#12
df198610172010-12-18 22:48
回复 10楼 八画小子
按你说的b=(++a)+(++a)+(++a)中++a不是一个完整的表达式,不立刻加1,那么b的值是不是3呢?
#13
八画小子2010-12-25 01:59
回复 12楼 df19861017
对于你说的问题,C++标准并没有说明应该是什么。不同的IDE、编译器有不同的结果。要知道你使用编译器是什么结果,你可以看看程序运行的结果是什么。对于这种问题,不比深究,想详细了解,可以查IDE手册。
1