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

自加 自减 运算符的问题

yim 发布于 2013-07-28 01:56, 1192 次点击
#include <iostream>
using namespace std;
int main()
{
    int i,j,m,n;
    i=8;
    j=10;
    m=++i+j++;
    n=(++i)+(++j)+m;
    cout<<i<<'\t'<<j<<'\t'<<m<<'\t'<<n<<endl;
    return 0;
}
这个是谭哥书上的课后习题。我编译后输出的结果是 10 12 19 41 。求指导,为什么m=19,n=41?能不能给个分析的详细思路?
19 回复
#2
peach54602013-07-28 08:01
++i和i++有什么区别,请楼主回答
#3
yim2013-07-28 10:20
回复 2楼 peach5460
++i:i使用前+1
i++: i使用后再+1

cout<<++i; 运算结果是9.
cout<<i++; 运算结果是8.但是i值为9.

我是不是可以这样理解:

i的运算过程是:在m的运算中,i=9.在n的运算中 i=10;
j的运算过程是:在m的运算中,j的结果虽然为10,但是实际上j为11.在n的运算中 j=12;
m的运算过程是:i=9,j=10. 所以结果为19;
n的运算结果为:10+12+19=41.

有错请狠狠拍砖。
#4
peach54602013-07-28 14:47
差不多,是这个意思
#5
额外覆盖2013-07-28 16:11
回复 3楼 yim
自己想得很好啊  
自增自减只要注意前置和后置时是先运算还是先取值
单独时没区别
#6
yim2013-07-28 18:47
回复 4楼 peach5460
谢谢!
#7
yim2013-07-28 18:54
回复 5楼 额外覆盖
就是取值问题,之前一直想不通,自己钻角落里了。
#8
TonyDeng2013-07-28 21:13
既然这里允许探讨这种问题,还答得那么热烈,我就不管了。
#9
额外覆盖2013-07-28 22:09
回复 8楼 TonyDeng
T版 这里毕竟不是csdn啊 很多都和我一样是新手    不过这种问题确实该自己分析的好
#10
TonyDeng2013-07-28 22:15
把代码写清晰一点,比钻研这种晦涩的代码有益得多。
#11
额外覆盖2013-07-28 22:39
确实 这种自增自减容易出问题  
过后来读在时候容易忘了自增的意义
#12
TonyDeng2013-07-28 22:47
以下是引用yim在2013-7-28 01:56:28的发言:

#include  
using namespace std;
int main()
{
    int i,j,m,n;
    i=8;
    j=10;
    m=++i+j++;
    n=(++i)+(++j)+m;

    cout<

他这里,描红的两行,第二行比第一行好点,第一行应与下一行用同样的方法,把子项用括号括起来,引导读者回忆++算符的概念(楼主显然没看书就急着做题)。如果实在不行,就把一行的++i和++j拆开了多行写,自己想表达的意图,自己最清楚,是使用变化前的值还是变化后的值,分行写哪有不清楚的道理,根本就不需要强硬使用这种语言独特的算符,难道没这种算符的语言就写不了不成。这种算符,在表达意图很清晰的场合,其实是很好的,但这个代码的例子就是刻意了,谭的书就总教这类代码不好(并非内容不好),考试也总考这种东西,可能都是这么教出来的吧。

分多行写,效率不会比写在一行低,因为编译器会自动优化,不需人工做的,写清晰了才是王道,自己做机器,就是降格把自己不当人看。

[ 本帖最后由 TonyDeng 于 2013-7-28 22:48 编辑 ]
#13
yim2013-07-28 23:49
回复 8楼 TonyDeng
我问这个问题的时候,自己已经想了一个下午加一个晚上还是没结果才问的。我是不是违反了论坛规则??
#14
yim2013-07-29 00:10
回复 12楼 TonyDeng
运算规则的先后顺序和算法的左右顺序想了很久(可能比较笨)。m这行我看了很久才分析出来,确实有括号比较容易理解以及分析。按照您的建议,我做了一些修改,您看这样是不是可以?(或许写出来不简洁,希望指正)

#include <iostream>
using namespace std;
int main()
{
    int i,j,x,y,m,n;
    i=8;
    j=10;
    x=++i;
    y=j++;
    m=x+y;
    n=(++i)+(++j)+m;
    cout<<i<<'\t'<<j<<'\t'<<m<<'\t'<<n<<endl;
    return 0;
}
#15
zhengchen0802013-07-29 12:39
++i就是先把i加一之后再运算,i++是先运算再把i加一
#16
zhengchen0802013-07-29 12:43
回复 14楼 yim
执行
x=++i;
y=j++;
之后i,j的的值已经改变了
x=i+1;y=j;i=i+1;j=j+1;

[ 本帖最后由 zhengchen080 于 2013-7-29 12:54 编辑 ]
#17
yim2013-07-30 01:17
回复 16楼 zhengchen080
所以,我写的这个可以么??我运行了一下,结果是一样的,只是不确定是否可以这样写。而且,还有更加简单又明确的写法么?我好想知道。
#18
love云彩2013-07-30 01:52
第一行标记红色代码修改后还可以
#19
TonyDeng2013-07-30 14:23
楼主还是没有醒悟去看书,我上面都提示你该看书了。搞清楚了++i和i++的运算次序,自然知道代码是什么结果。别以为教编程的书就只看代码,文字远比代码重要,宁愿不看代码也不能不看文字,代码可以在看过文字之后自己写,看人家的代码只能被人牵着走,连属于自己的东西都难得有。

如果书上的文字都不愿去看,那么別人回复帖子的文字也同样不会仔细去看,再怎么解释也是徒劳,因为本来不需在这样的地方重复劳动的。

所谓++算符,无非就是两种区别:

x = i++;
等价于
x = i;
i = i + 1;

x = ++i;
等价于
i = i + 1;
x = i;

也就是说,前缀++和后缀++的区别,就是上面i = i + 1这个功能是放在x = i的前面还是后面。它本身就是两行,不会因为你写一行就比两行高效,编译器编译出来的结果是一样的。记住:源代码和实际执行代码是两回事,实际执行代码往往不是源代码你自以为的那样,在现代编译器和机器环境面前,很多以前的小技巧往往弄巧成拙。不要把心思放在这些东西上面,抓住核心,不要纠缠细节。搞不清楚那些算符的区别,就用最原始的方法,用我上面的两种写法,把自己的真实意图表达出来,即你到底想i = i + 1在什么时候执行,明确地写就是了。

[ 本帖最后由 TonyDeng 于 2013-7-30 15:02 编辑 ]
#20
zhengchen0802013-08-01 15:51
回复 17楼 yim
19楼解释的很清楚啊
1