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

谁能告诉我这是为什么

freish 发布于 2008-11-03 23:19, 1962 次点击
程序代码:
#include <iostream>
using namespace std;
int main()
{
    int a=1;
    //int d = a++ + a-- + a++;
    int s = (a++) + (--a) + (a--) + (++a);

    //int p =++a;
    //p += a--;
    //p += ++a;
    printf("s=%d\na=%d",s,a);
    return 0;
}


谁能告诉我这个程序是怎么执行的

[[it] 本帖最后由 freish 于 2008-11-4 10:04 编辑 [/it]]
22 回复
#2
freish2008-11-03 23:30
结果与想象的完全不一样
#3
lockhawk2008-11-03 23:32
试验结果是
a=2
d=3
s=5
但不明白??要是我手算应该是:2,4,8。。。。
谁来说一下啊
#4
youhm2008-11-04 00:03
按从左到右的顺序计算

a = 2
s = a++ + --a + a-- + ++a
s = ((1   + 1)+ 1 ) +   2
#5
阿魔密火2008-11-04 00:43
#include <iostream>
using namespace std;
改成如下
int main()
{
    int a=1;
    int d = a++, e=a--, f=a++;
    int g=d+e+f;
    int s = a++ + --a + a-- + ++a;
    cout<<a<<","<<g<<","<<s;
    system("pause");
}
运行结果是 2,4,8

而楼主给的程序
#include <iostream>
using namespace std;
int main()
{
    int a=1;
    int d = a++ + a-- +a++;
    int s = a++ + --a + a-- + ++a;
    cout<<a<<","<<d<<","<<s;
    system("pause");
}

运行结果2,3,8
(我的运行平台是vc2005)我也感到奇怪
#6
夜罗刹2008-11-04 00:46
优先级自增自减运算符较高
int d = a++ + a-- + a++ 写成int d = (a++) + (a--) + (a++)
  运算时取a的值1相加三次后得到d=3 而后进行自增自减运算得到a=2
  进入
 int s = a++ + --a + a-- + ++a
  这个我算的是
  2+1+1+2=6
 不知道谁能来回答一下
#7
阿魔密火2008-11-04 00:55
六楼
int s=a++ + --a +a-- + ++a
++a先自增在用,a++先用在自增。
应该是2+2+2+2=8
a++ 表达式变为2 a值变为3
--a 表达式变为2 a值变为2
a-- 表达式变为2 a值变为1
++a 表达式变为2 a值变为2
最后四个表达式相加即为2+2+2+2=8
#8
freish2008-11-04 07:57
大家试验后在说话,不要空想,结果是与想象不一样的

但在java中就与想象中的一样了
#9
youhm2008-11-04 08:51
各种编程环境编译可能会有差异

在VC6.0里我认为是这样的

后置的自增自减运算符在语句结束后在考虑,也即对本条语句结果不产生影响

int a=1;
int d=a++ + a-- + a++;
int s=a++ + --a + a-- + ++a;

可以写成下面这样

int a=1;
int d=a + a + a
a++;
a--;
a++;

--a;
int s=a + a;
s=s + a;
++a;
s=s+a;
a++;
a--;
#10
冰烨2008-11-04 09:29
右结合应该是248,vc2005是左结合,左结合应该是238
#11
freish2008-11-04 09:42
[bo][un]冰烨[/un] 在 2008-11-4 09:29 的发言:[/bo]

右结合应该是248,vc2005是左结合,左结合应该是238

貌似不是按左右结合来的
我左右都算了,调试的结果却与左右结合的结果都不相同
#12
freish2008-11-04 09:55
百思不得其解啊
#13
sunkaidong2008-11-04 09:56
楼上的兄弟怎么跑c++来了..你的java很棒...对于类的操作很娴熟...呵呵
#14
freish2008-11-04 10:00
[bo][un]sunkaidong[/un] 在 2008-11-4 09:56 的发言:[/bo]

楼上的兄弟怎么跑c++来了..你的java很棒...对于类的操作很娴熟...呵呵

最近找工作老考c++,一年多没接触这东西了,回顾一下,复习一下

神啊,给我工作吧!
#15
sunkaidong2008-11-04 10:02
我也找不到工作呢....我也和你一样在祈祷啊..呵呵
#16
newyj2008-11-04 10:41
int s = (i=a++) + (j=--a) + (k=a--) + (u=++a);
cout<<s<<endl<<i<<endl<<j<<endl<<k<<endl<<u<<endl;
输出的i,j,k,u都是 1 这个想到了
但是s也输出为 1 为什么?

cout<<i<<endl<<j<<endl<<k<<endl<<u<<endl<<s<<endl;
但是把s放到最后输出 就是4了
#17
youhm2008-11-04 10:47
00401578   mov         dword ptr [ebp-4],1
8:
9:        int d=a++ + a-- + a++;
0040157F   mov         eax,dword ptr [ebp-4]
00401582   add         eax,dword ptr [ebp-4]
00401585   add         eax,dword ptr [ebp-4]
00401588   mov         dword ptr [ebp-8],eax
0040158B   mov         ecx,dword ptr [ebp-4]
0040158E   add         ecx,1
00401591   mov         dword ptr [ebp-4],ecx
00401594   mov         edx,dword ptr [ebp-4]
00401597   sub         edx,1
0040159A   mov         dword ptr [ebp-4],edx
0040159D   mov         eax,dword ptr [ebp-4]
004015A0   add         eax,1
004015A3   mov         dword ptr [ebp-4],eax
10:
11:       int s=a++ + --a + a-- + ++a;
004015A6   mov         ecx,dword ptr [ebp-4]
004015A9   sub         ecx,1
004015AC   mov         dword ptr [ebp-4],ecx
004015AF   mov         edx,dword ptr [ebp-4]
004015B2   add         edx,dword ptr [ebp-4]
004015B5   add         edx,dword ptr [ebp-4]
004015B8   mov         eax,dword ptr [ebp-4]
004015BB   add         eax,1
004015BE   mov         dword ptr [ebp-4],eax
004015C1   add         edx,dword ptr [ebp-4]
004015C4   mov         dword ptr [ebp-0Ch],edx
004015C7   mov         ecx,dword ptr [ebp-4]
004015CA   sub         ecx,1
004015CD   mov         dword ptr [ebp-4],ecx
004015D0   mov         edx,dword ptr [ebp-4]
004015D3   add         edx,1
004015D6   mov         dword ptr [ebp-4],edx
12:
13:       cout<<a<<endl<<d<<endl<<s<<endl;
#18
freish2008-11-04 10:54
[bo][un]youhm[/un] 在 2008-11-4 10:47 的发言:[/bo]

00401578   mov         dword ptr [ebp-4],1
8:
9:        int d=a++ + a-- + a++;
0040157F   mov         eax,dword ptr [ebp-4]
00401582   add         eax,dword ptr [ebp-4]
00401585   add         eax ...

OH,汇编,丢了很多年了

听说这个代码在里跑出来的结果跟java中是一样的
#19
lockhawk2008-11-04 18:21
谢谢9楼!但是换一个式子又不对了。看看:
/*
#include <iostream.h>

int main()
{
    int a=1;
    int d = ++a + --a+ ++a;
    cout<<d;
    return 0;
}
*/
/*
a=1
++a
d=a
--a
d=d+a
++a
d=d+a    d应该等于5。但输出是d=4
*/


/*
#include <iostream.h>
int main()
{
    int a=1;
    int d=++a + ++a;
    cout<<d;
    return 0;
}
*/
/*
a=1
++a
d=a
++a
d=d+a   这样算应该是d=5 ,但输出d=6
*/
#20
youhm2008-11-04 19:28
int a=1;
int d = ++a + --a+ ++a;
等效下面的
int a=1;
++a;
--a;
int d=a+a;
++a;
d=d+a;


int a=1;
int d=++a + ++a;

等效为
int a=1;
++a;
++a;
int d=a+a;
#21
中学者2008-11-05 08:55
求值顺序不确定的未定义行为不用讨论....
只规定了加法如何结合,但是没规定先求谁..
#22
lockhawk2008-11-05 10:28
理解了。谢谢youhm。下次版主选你。
顺便问问,这个道理用一句话怎么概括?书上没有。。。。。
#23
youhm2008-11-05 10:53
[bo][un]lockhawk[/un] 在 2008-11-5 10:28 的发言:[/bo]

理解了。谢谢youhm。下次版主选你。
顺便问问,这个道理用一句话怎么概括?书上没有。。。。。

呵呵,我是初学者,水平比版主差远了

其实这个弄明白就没什么,就是按优先顺序来的
1