三元运算符 A?B:C 返回值问题

  
#include <iostream>
using namespace std;
#define min(x,y) ((x<y)?x:y)
int main()
{
int a,b,c;
a=2;
b=42;
c=min(a++,b);
cout<<a<<" "<<b<<" "<<c<<endl;
return 0;
}

输出结果:4 42 3

执行min(a++,b)的时候a++执行了2次,所以是4,
三元运算符A?B:C的返回这里返回B,即是x++执行了2次,那为什么返回值却是3

  
c=min(a++,b);
008D1A6C mov eax,dword ptr [a]
008D1A6F mov ecx,dword ptr [b]
008D1A72 mov edx,dword ptr [a]
008D1A75 add edx,1 ;第一次a++
008D1A78 mov dword ptr [a],edx
008D1A7B cmp eax,ecx
008D1A7D jge main+53h (8D1A93h)
008D1A7F mov eax,dword ptr [a]
008D1A82 mov dword ptr [ebp-0E8h],eax ;这里直接就把一次a++的结果保存了
008D1A88 mov ecx,dword ptr [a]
008D1A8B add ecx,1 ;第二次a++
008D1A8E mov dword ptr [a],ecx
008D1A91 jmp main+5Ch (8D1A9Ch)
008D1A93 mov edx,dword ptr [b]
008D1A96 mov dword ptr [ebp-0E8h],edx
008D1A9C mov eax,dword ptr [ebp-0E8h] ;eax保存的就是上面的结果,当做返回值返回给c
008D1AA2 mov dword ptr [c],eax

反汇编的结果的确是这样,为什么在执行第二次a++之前就先保存返回值?
a++是取a放寄存器然后+1然后保存回原地址,a++这种机制跟上面的三元运算符有什么关联?

评论 (0)链接2012-08-27 

a++是返回a的原值再进行加一的操作,所以会有一个保存a值的操作

  
#include <iostream>
using namespace std;
#define min(x,y) ((x<y)?x:y)
int main()
{
int a,b,c;
a=2;
b=42;
c=min(++a,b);
cout<<a<<" "<<b<<" "<<c<<endl;
return 0;
}

如果改成++a输出就是4了

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-08-27

测试了一下,的确是这个结果,但是出现这样的返回结果并不是条件运算符的问题,而是宏定义的原因。
宏定义 #define min(x,y) ((x<y)?x:y) 将min(a++,b)展开应为
((a++ < b) ? a++ : b),
想必这样就比较明了了, 换成if就成为:

  
if(a++ < b)   //执行一次a++, a = 3
return a++; //返回a,此时a=3; 执行一次a++, a = 4
else
return b;
artist
编辑于 2012-08-27
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-08-27

我认为你说的是没关联的,最重要的是,后自增必须是先执行完该语句之后再自增,那么就拿你给出的例子来说,进行判断的时候,先自增了一次,判断语句执行完了,所以自增变成3。到这个时候,看你的问题描述你也没有什么疑惑,其实很简单,同理,在执行完return之后,才会自增第二次,所以得到的a是4,但是得到的返回值是3。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-08-27
德问是一个专业的编程问答社区,请 登录注册 后再提交答案