2012-08-04 75 views
0

我正在解决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。

为什么我得到这样的输出和我犯错的地方?

谢谢!

回答

3

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

||&&的特别之处在于第一操作数总是被判断的第一和第二个操作数(包括所有的子表达式)是如果需要确定表达式的值来评价。

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

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

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

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

在子表达(++x) || ((++y) && (++z)),如(++x)计算结果为true(如2是非零),所述第二操作者((++y) && (++z))是从来evaluted。 x变为2,y不变并且z被分配为1true转换为整数)。

+0

Charles Bailey非常感谢。所以基本上,运算符优先级先将表达式组合起来。评估总是从左到右完成是不是? – 2012-08-04 22:10:12

+0

@ritesh_nitw:通常,表达式的评估不一定​​是从左到右进行的,但是这对于'||'和'&&'来说是确定的,其中左操作数总是首先被评估。 – 2012-08-04 22:12:32

3

&&||运营商是短路。他们评估左侧,然后仅在必要时才评估右侧以确定其值。

因此,如果||的左侧为true,则不计算右侧,如果&&的左侧为false,则不计算右侧。

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

1

逻辑OR运算符要求两个操作数中的任何一个非零,然后条件成立。在表达式A||B中,AB非零,那么(A || B)将等于或等于1。 所以++y++z将被编译器忽略,因为++x的值是1

1

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

例如,如果使用& &运算符,则需要对两个表达式进行评估。但是,如果您使用||运算符(您有),如果左侧的第一个表达式为真,则不会执行右侧。在你的例子中,++ x给出2,它被评估为一个布尔值TRUE。因为一旦真的,编译器的故事结束,一个OR语句将永远不会回复到FALSE。这个概念被编译器称为“短路”。这就是为什么你得到你描述的输出。