【问题标题】:What happen if I use pre increment and post increment in the same statement? [duplicate]如果我在同一个语句中使用前置增量和后置增量会发生什么? [复制]
【发布时间】:2013-08-27 19:28:47
【问题描述】:

我今天看到一个关于后增量和前增量的有趣声明。请考虑以下程序-

#include <stdio.h>

int main(){
    int x, z;

    x = 5;
    z = x++ - 5; // increase the value of x after the statement completed.
    printf("%d\n", z); // So the value here is 0. Simple.

    x = 5;
    z = 5 - ++x; // increase the value of x before the statement completed.
    printf("%d\n", z); // So the value is -1.

    // But, for these lines below..

    x = 5;
    z = x++ - ++x; // **The interesting statement
    printf("%d\n", z); // It prints 0

    return 0;
}

那个有趣的陈述实际上发生了什么?后增量应该在语句完成后增加 x 的值。那么对于该语句,first x 的值仍为 5。而在预增量的情况下,second x 的值应该是 6 或 7(不确定)。

为什么它给出的值是0 到 z?是 5 - 5 还是 6 - 6?请解释一下。

【问题讨论】:

  • 您将进入未定义的行为,这实际上取决于编译器如何处理它。
  • 还有this one

标签: c++ c post-increment pre-increment


【解决方案1】:

这是未定义的行为。编译器可以随心所欲地做任何事情——它可能给出 0,可能给出 42,它可能会擦除你的硬盘驱动器,或者它可能会导致恶魔飞出你的鼻子。所有这些行为都是 C 和 C++ 语言标准所允许的。

【讨论】:

  • 实际上14.2.7部分明确禁止编译器生成产生鼻恶魔的代码,但所有其他行为都是允许的。
  • 未定义的语句是什么? Java 不会犹豫;)
  • 好的,这是未定义的行为。但为什么?我认为它的计算结果为 5 - 6(++x 在减法之前,x++ 在减法之后)。将其更改为 (x++)-(++x) 会改变结果吗?
  • @Kevin 不,仍然没有序列点。对于- 的左操作数还是右操作数首先被求值没有规则。
  • @Paulpro 如果您超载前/后增量,评估顺序仍然未指定,而行为变得明确。
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 2015-12-21
  • 2012-07-11
  • 2015-08-06
  • 2014-12-06
  • 2011-01-02
  • 2014-06-03
  • 1970-01-01
相关资源
最近更新 更多