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。

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

谢谢!

4

4 回答 4

3

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

||并且&&特别之处在于始终首先计算第一个操作数,并且仅在需要确定表达式的值时才计算第二个操作数(包括所有子表达式)。

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

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

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

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

在 sub-expression(++x) || ((++y) && (++z))中, as 的(++x)计算结果为true(因为 2 非零),第二个运算符((++y) && (++z))永远不会被计算。x变为 2,y不变并被z赋值1true转换为整数)。

于 2012-08-04T21:59:58.573 回答
3

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

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

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

于 2012-08-04T21:57:58.673 回答
1

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

于 2012-08-04T22:00:47.323 回答
1

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

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

于 2012-08-04T22:03:32.580 回答