【问题标题】:Why are expressions not processed after a postfix increment and a conjunction operator?为什么在后缀增量和合取运算符之后不处理表达式?
【发布时间】:2020-09-23 21:31:14
【问题描述】:

我遇到了一个问题,促使我进行了一些研究。我发现有这样一段代码:

#include <stdio.h>

int main(void)
{
    char i = 0;
    i++ && puts("Hi!");
    printf("%hhd\n", i);
}

只处理增量,并输出:

1

如果后缀增量被前缀替换,则不是这种情况,它会输出:

Hi!
1

为什么会这样?

如果问题很愚蠢,我深表歉意。

【问题讨论】:

  • 了解逻辑运算符的短路评估
  • &amp;&amp;|| 进行短路评估。如果您说x &amp;&amp; y,那么如果x 为假(0),那么整个表达式为假,因此不需要评估y 部分。而且,在您的程序中,我 is false (0) 因为它在 AFTERWARDS 之后递增(它是一个后递增)
  • 它看起来不像 i++ 应该被评估为 falsetrue
  • 如果它是逻辑表达式的一部分(例如包含 &amp;&amp;|| 的表达式),则所有内容都被视为真或假 - 值为 0 为假,其他为真。跨度>

标签: c increment postfix-operator prefix-operator


【解决方案1】:

i++ &&  puts("Hi!");

i 在增量之前进行评估。因为是0,所以表达式的第二部分不再需要求值,0 &amp;&amp; 000 &amp;&amp; 1 也是0

具有预增量的相同表达式意味着i在计算时将是1,在这种情况下,表达式的第二部分很重要,因为1 &amp;&amp; 1是可能的,但1 &amp;&amp; 0也是可能,这些将呈现不同的结果。

【讨论】:

  • 当您发布此消息时,我刚刚想到了这个想法,您证实了我的怀疑:)
  • @Kaiyaha,好吧,看来问题解决了:)
  • 肯定的,只需要等待几分钟就可以接受它
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2011-05-19
  • 2022-11-24
相关资源
最近更新 更多