优先规则

时间:2012-08-04 21:54:10

标签: c++

我正在解决C ++多项选择题。 我无法理解以下代码::

的输出
#include <iostream>
using namespace std;
int main()
{
    int x,y,z;
    x=y=z=1;
    z=++x || ++y && ++z;
    cout<<x<<" "<<y<<" "<<z<<endl;
    system("pause");
    return 0;
}

我按照以下方式解决这个问题:: 优先顺序::

Precedence "++" greaterthan Precedence "&&" greaterthan  Precedence "||"

另外,一元++的相关性是“从右到左” 。 所以

z=(++x)||(++y) && (2)
z=(++x)||(2)&& (2)
z=(2)||(2)&&(2)
z=(2)|| 1  //As 2 && 2 is 1(true)
z=1       // As 2 || 1 is 1(true)

就我而言,正确的输出应该是x = 2,y = 2和z = 1.

但是当我在编译器中运行此代码时,编译器输出为x = 2,y = 1,z = 1.

为什么我会得到这样的输出以及我在哪里犯错?

谢谢!

4 个答案:

答案 0 :(得分:3)

&&||运算符短路。他们评估左侧,然后仅在必要时评估右侧以确定值。

因此,如果||的左侧为真,则不评估右侧,如果&&的左侧为假,则不评估右侧。

在您的示例中,由于++x为真(2),因此不会评估||的右侧。

答案 1 :(得分:3)

运算符优先级告诉您如何对表达式进行分组;它没有告诉你它们的执行顺序。

||&&的特殊之处在于,第一个操作数始终首先被评估,第二个操作数(包括所有子表达式)仅在 评估(如果需要)确定表达式的值。

对于||,如果第一个操作数计算为true,则不计算第二个操作数,因为逻辑结果或将始终为真。

类似地,如果第一个操作数的计算结果为false,则不会计算&&的第二个操作数 - 在这种情况下必须为false。

在表达式z=++x || ++y && ++z中,语法规则指定分组:

z = ((++x) || ((++y) && (++z)));

在子表达式(++x) || ((++y) && (++z))中,当(++x)求值为true(因为2非零)时,永远不会计算第二个运算符((++y) && (++z))x变为2,y未更改,z被分配1true已转换为整数)。

答案 2 :(得分:1)

逻辑OR运算符要求如果两个操作数中的任何一个不为零,则条件变为真。在表达式A||B中,AB不为零,则(A || B)将为真或等于1。 因此,++y++z将被编译器忽略,因为++x的值为1

答案 3 :(得分:1)

请记住,只有在需要时,编译器才会执行整个逻辑表达式。否则,它试图尽可能少地工作。

例如,如果你使用&amp;&amp;运算符,必​​须对两个表达式进行求值。但是,如果您使用||运算符(您有),如果左侧的第一个表达式为真,则不执行右侧。在您的示例中,++ x给出2,其被计算为布尔值TRUE。编译器的故事结束,因为一旦为真,OR语句永远不会恢复为FALSE。这个概念被编译器称为“短路”。这就是你得到你所描述的输出的原因。