C中的一个语句中的递增和递减运算符

Increment and decrement operators in one statement in C

我知道这在理论上是未定义的行为,当然也是糟糕的风格。这是一个学校的例子(我不是小学生)。 但为什么我得到 7(示例 a)resp。 1(示例 b)出此操作:

在线示例: https://onlinegdb.com/B172lj8k8

一个:

#include <stdio.h>

int main()
{
    int i = 2;
    printf("%d; i=%d", ++i + i++, i);
    return 0;
}

b:

#include <stdio.h>

int main()
{
    int i = 2;
    printf("%d; i=%d", ++i - i++, i);
    return 0;
}

我认为输出应该是 6 和 2。

  1. 执行i++,yield 2,递增i
  2. 执行++i yield 4
  3. 附加 2 + 4

另一个例子应该是 4 - 2。

在一个语句中执行自增似乎立即产生自增的结果,无论是后缀还是前缀,这很奇怪。还是我完全弄错了?

未指定传递给函数的参数的求值顺序,+ 的操作符的求值顺序也未指定。

因此在 printf("%d %d", i+1, i-1) 中,例如,您不能依赖参数的评估顺序;实际上,i+1 可能会在 i-1 之后被评估;你不会承认,因为对一个的评估不会影响另一个的结果。

与 "side effects" 结合使用 post 递增 i++,但是,在特定时间点递增 i 的效果可能会影响结果其他评价基于i。因此,在C中是"undefined behaviour",如果一个变量在一个表达式中被多次使用,并且副作用改变了它的值(形式上,准确地说,如果中间没有序列点)。