【问题标题】:Unable to understand the execution when using the logical operators [duplicate]使用逻辑运算符时无法理解执行[重复]
【发布时间】:2016-06-26 18:28:16
【问题描述】:

这是代码:

void main()
{
    clrscr();
    int a=-3 , b=2 , c=0, d;
    d = ++a && ++b || ++c;
    printf("a=%d , b=%d , c=%d, d=%d ",a,b,c,d);
    getch();
}

输出:-2 , 3 , 0 , 1

我无法理解为什么c 的值没有增加,我认为应该是1 以及d = 1 的输出。

【问题讨论】:

  • 请注意,答案与您询问看起来非常相似的表达式 d = ++a & ++b | ++c; 的情况完全不同。

标签: c++ c logical-operators


【解决方案1】:

声明;

d = ++a && ++b || ++c;

从左到右分组(给定precedence of &&);

d = (++a && ++b) || ++c;

因此,在计算&& 时,由于第一个操作数为真(++a),因此计算第二个操作数(++b)。此时,这个逻辑与的结果是true;因此逻辑 OR 为真,不计算其第二个操作数(++c)。

这种行为是有保证的,通常称为短路评估。在 C++ 和 C 标准中对此的措辞是listed here, in this answer;此处为 C++ 简要转载;

§5.14 逻辑与运算符

1 && 运算符从左到右分组。操作数都根据上下文转换为 bool(第 4 条)。如果两个操作数都为真,则结果为真,否则为假。与& 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。

§5.15 逻辑或运算符

1 || 运算符从左到右分组。操作数都根据上下文转换为 bool(第 4 条)。如果其中一个操作数为真,则返回真,否则返回假。与| 不同,|| 保证从左到右的评估;此外,如果第一个操作数的计算结果为真,则不计算第二个操作数。

【讨论】:

    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2011-03-14
    • 2020-10-02
    • 2022-08-24
    相关资源
    最近更新 更多