程序1:
#define MAX(x,y) (x)>(y)?(x):(y)
int main()
{
int i=10,j=5,k=0;
k==MAX(i++,++j);
cout<<i<<j<<k;
return 0;
}
o / p:11 7 0
计划2:
#define MAX(x,y) (x)>(y)?(x):(y)
int main()
{
int i=10,j=5,k=0;
k=MAX(i++,++j);
cout<<i<<j<<k;
return 0;
}
o / p:12 6 11
如果您仔细查看上述两个程序,我只会更改一行,prog1.k==max()
为prog2.k=max()
,为什么会发生这种情况....?
答案 0 :(得分:4)
在您的第一个程序中,它将扩展为
k==(i++)>(++j)?(i++):(++j)
相当于:
(k == ((i++) > (++j))) ? (i++) : (++j)
由于第一个((i++) > (++j))
评估为true
,因此(k == ((i++) > (++j)))
将评估为false
,因此仅评估第二个(++j)
。
结果:(i++)
评估一次,i
变为11
,j
评估两次,j
变为7
。 k
未被修改。
编译器实际上会发出有关此行为的警告,请参阅this
第二个扩展到:
k=(i++)>(++j)?(i++):(++j);
这很容易理解,i
将是12
,j
将是6
,k
是i++
之前的结果第二个增量,即11
。
无论如何,请不要在C ++中使用宏,除非你别无选择。
答案 1 :(得分:0)
在定义之后,您的代码已经变换,如下所示
int main()
{
int i=10,j=5,k=0;
//(x)>(y)?(x):(y)
k == (i++)>(++j)?(i++):(++j);
//i = 11, j = 7, k = 0
k = (i++)>(++j)?(i++):(++j);
//i = 12, j = 6, k = 11
cout<<i<<j<<k;
return 0;
}
第一种情况:程序有序运行
temp&gt; (++ j)? (I ++):(++ j)的;
//首先,++ j。然后,j = 6并检查temp&gt; 6?这是假的,运行++ j。所以j = 7
因此,i = 11,j = 7,k没有改变。
第二种情况:程序有序运行
因为i = 10,j = 6,所以这是真的; (i ++):( ++ j),我们做前者,i = 11.
然后,k = i;所以,k = 11。
在上述陈述之后,i = 12因为++ i;
因此,i = 12,j = 6,k = 11
答案 2 :(得分:-1)
你应该知道= and ==
,=是赋值运算符和==是比较运算符之间的区别,在第一种情况下k = 0,因为你没有在k中分配任何东西,其他值是不同的我不要我不知道你是如何运行这个程序的,单独运行它应该是相同的
答案 3 :(得分:-2)
你有程序1
k==MAX(i++,++j); // notice 2 equal signs
你有程序2
k=MAX(i++,++j); // 1 equal sign.