解释以下输出?

时间:2014-11-03 08:05:42

标签: c++ operator-precedence

请解释输出:

#include<iostream.h>
int main()
{
    int i= -3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}

输出: -2 2 0 1

这就是我的想法: (++ i || ++ j)&amp;&amp; (++ k)//考虑优先顺序 ++我变为-2所以OR的第一部分是真的,所以它不会检查第二部分 (感谢Joachim Pileborg告诉我短路评估)

总的来说,AND的第一部分是真的。 但这还不足以使陈述真实,第二部分必须是真实的。 所以++ k使得k = 1 在这里,我弄错了。为什么k不增加?

然而,在这种情况下:

#include<iostream.h>
int main()
{
    int i= -1, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}

输出: 0 3 1 1

考虑到短路评估,我也得到了这个。

3 个答案:

答案 0 :(得分:1)

让我们从这段代码开始

#include<iostream.h>
int main()
{
    int i= -3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}

很明显,m将布尔值转换为int。由于++i等于-2且不等于零,因此不会评估所有其他表达式,因为已知整个表达式等于true。所以在声明之后

    m = ++i || ++j && ++k;

m等于1,i等于-2所有其他变量均未更改。

在此代码段中

#include<iostream.h>
int main()
{
    int i= -1, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}

++i将等于0.因此将评估operator ||的右操作数。这个操作数是

++j && ++k

由于++j将等于3且不等于0,因此++k也将被评估并且将等于1.因为operator &&的两个操作数不相等为零,则结果等于true

因此你会得到i == 0,j == 3,k == 1,m == 1.

来自C ++标准

5.14逻辑AND运算符

  

1&amp;&amp;操作员组从左到右。操作数都是   在上下文中转换为bool(第4条)。如果两者都是如此   操作数是真的,否则是假的。不像&amp;,&amp;&amp;担保   从左到右的评估:如果是,则不评估第二个操作数   第一个操作数是假的。

5.15逻辑OR运算符

  

1 ||操作员组从左到右。操作数都是   在上下文中转换为bool(第4条)。如果有的话,它返回true   它的操作数是真的,否则是假的。与|, ||不同   保证从左到右的评估;而且,第二个操作数是   如果第一个操作数的计算结果为true,则不进行评估。

答案 1 :(得分:0)

在逻辑表达式中,例如:... || ... && ... C ++可以省略不会改变表达式输出值的执行语句。例如:如果它计算第一个值并且它的输出不等于0,则表达式:true || ... && ...始终为true,因此不需要执行更多表达式

答案 2 :(得分:0)

以下是你的第二个案例: -

int i= -1, j=2, k=0, m;
m = ++i || ++j && ++k;

( cond1 || cond2) 

表达式如果cond1为true,则编译器不会继续检查cond2。仅当cond1返回false时,它才会评估cond2。

所以,在第二个++中,我将第一个表达式设为false并强制编译器继续进行进一步求值,而在第一个案例中,第一个表达式返回true。