此函数输出的说明

Bob*_*bis 5 c logical-operators integer-arithmetic output

我正在做复习问题,问我"以下内容的输出是什么",我在理解这个功能方面遇到了一些麻烦:

int a = 1, b = 1, c = -1;
c = --a && b++;
printf("%d %d %d", a, b, c);
Run Code Online (Sandbox Code Playgroud)

输出是010.我的问题是关于第2行,c = --a && b++.如何处理此行,以及它如何工作/更改值?如果是的话c = --a || b++?从我的理解,我认为输出将是020.

Tri*_*und 12

理解结果的关键概念是布尔运算符的短路评估(&&||) - 如果在评估布尔运算符的左侧后,右侧的值不能影响整体结果,那么不会被评估,它会产生任何副作用.

在第一种情况下,由于--a求值为0(= false),... && ...因此未评估第二部分,因为" false AND anything "将始终为false.具体来说,b++永远不会执行,因此其值仍保留1在输出中.

在的情况下--a || b++,整个表达式的值不能由左侧确定(" 假或什么 "仍然是真实的),因此b++ 评价(和它的副作用,增加b,发生).

完全理解结果所需的另一个概念是前后增量/减量运算符之间的差异.如果--++出现之前变量(如在--a),那么变量递减或递增第一和值被用于评估整个表达式.如果变量(--变量之后)++出现,则变量b++当前值用于计算表达式,并在发生变量后发生增量/减量.

应当指出的是,表达式,尝试两个或多个实例相结合的--/ ++ 同一个变量(如a++ + ++a)是很可能会调用未定义的行为 -结果可以通过平台,编译器,编译器和一天中的某些时间会有所不同.

  • 一个完整的答案应该优先触及前后增量之间的差异 (3认同)

bla*_*azs 6

在表达式中c = --a && b++,a减少并返回.现在,--a && b++由于短路评估,表达式的第二个参数没有被评估 - 一旦我们看到--a==0我们已经知道表达式将与另一个参数--- 0 无关,所以b保持不变.

下降a0b保持1.

正如你的建议,输出是0 1 0.

关于第二个问题,如果你写c = --a || b++,变量a再次变为零,但表达式仍然可以评估为真 - 我们必须因此评估第二部分,从而执行b++返回1和增加b.在这种情况下,输出将是0 2 1,由于c被分配的值0 || 11.

简而言之,请继续阅读