为什么i和j的值不同,程序只有一个变化

时间:2016-12-20 05:17:53

标签: c++

程序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(),为什么会发生这种情况....?

4 个答案:

答案 0 :(得分:4)

在您的第一个程序中,它将扩展为

k==(i++)>(++j)?(i++):(++j)

相当于:

(k == ((i++) > (++j))) ? (i++) : (++j)

由于第一个((i++) > (++j))评估为true,因此(k == ((i++) > (++j)))将评估为false,因此仅评估第二个(++j)

结果:(i++)评估一次,i变为11j评估两次,j变为7k未被修改。

编译器实际上会发出有关此行为的警告,请参阅this

第二个扩展到:

k=(i++)>(++j)?(i++):(++j);

这很容易理解,i将是12j将是6ki++之前的结果第二个增量,即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;
}

第一种情况:程序有序运行

  1. int temp =(k == i ++); //显然temp = 0,然后i = 11
  2. temp&gt; (++ j)? (I ++):(++ j)的;

    //首先,++ j。然后,j = 6并检查temp&gt; 6?这是假的,运行++ j。所以j = 7

  3. 因此,i = 11,j = 7,k没有改变。

    第二种情况:程序有序运行

    1. (i ++)&gt; (++ j)的?
    2. 因为i = 10,j = 6,所以这是真的; (i ++):( ++ j),我们做前者,i = 11.

      1. 然后,k = i;所以,k = 11。

      2. 在上述陈述之后,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.