| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1463 人关注过本帖
标题:增量运算
只看楼主 加入收藏
zhanghang123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:24
注 册:2010-3-20
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:12 
增量运算
程序代码:
#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,不理解,哪位高手给解释一下?
搜索更多相关主题的帖子: 增量 运算 
2010-12-15 13:28
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:2 
程序代码:
#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了   呵呵  编译器问题................

                                         
===========深入<----------------->浅出============
2010-12-15 17:33
angelpaiy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-12-13
收藏
得分:0 
回复 楼主 zhanghang123
这个怎么看都像等9哦
2010-12-15 17:53
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:2 
呵呵   下面的确实是9   但是上面的那个为什么是10  我也解释不了.......

这样的问题与编译器有关  不必深究

                                         
===========深入<----------------->浅出============
2010-12-15 17:59
angelpaiy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-12-13
收藏
得分:0 
哦哦,了解了解,路过看看,呵呵
2010-12-15 18:01
zhanghang123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:24
注 册:2010-3-20
收藏
得分:0 
回复 2楼 laoyang103
恩,我也觉得应该是9。呵呵……
2010-12-15 23:28
danpandong
Rank: 2
等 级:论坛游民
帖 子:8
专家分:17
注 册:2010-12-8
收藏
得分:1 
这种问题没有必要深究,没有什么用。
2010-12-16 10:56
xishui777
Rank: 2
等 级:论坛游民
帖 子:53
专家分:94
注 册:2010-8-17
收藏
得分:0 
学习下
2010-12-16 12:33
懂也不懂
Rank: 4
等 级:业余侠客
威 望:2
帖 子:73
专家分:224
注 册:2010-12-1
收藏
得分:1 
这个跟编译器有关,在vs2008里,他是默认括号优先级较高,所以他会先将b=(++a)+(++a)+(++a)里的三个括号运算先算了,即a=4;然后再加起来即4+4+4=b=12;哈哈
2010-12-16 13:05
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:3 
多注意一下,之前其实我们讨论过,这个问题的回复看相关贴子
在讨论递增操作符之前先说明几个概念,之后会用到。
    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++初学者。在群中,我会不定期上传类似文章和大家一起讨论。
2010-12-16 13:20
快速回复:增量运算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012571 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved