3
#include <stdio.h>

int main()
{
  int x=100;
  x=x++;
  printf("x : %d\n",x); //prints 101
  return 0;
}

输出 101 的原因是什么?我认为输出应该是100。

4

7 回答 7

6

由于序列点,这是未定义的行为

在连续的“序列点”之间,一个对象的值只能被一个表达式修改一次

前一个表达式的结尾x=100;是一个序列点,结尾x=x++;是另一个。

基本上,您的表达式没有中间“序列点”,但您要修改 X 的值两次。结果是未定义的行为:基本上,任何事情都可能发生:您可能会得到 100、101 或 42...

于 2013-05-14T16:42:06.380 回答
4

这是我相信您正在寻找的内容:

int main(){
    int x=100;
    printf("x : %d\n",x++); // Will print 100 and then increment x
    return 0;
}
于 2013-05-14T16:26:58.600 回答
1

x在打印之前递增 - 所以这就是 output 的原因101

您正在执行与x = x; x++;

于 2013-05-14T16:26:19.790 回答
0

这就是正在发生的事情

#include <stdio.h>

int main()
{
  int x=100;
  x=x++; // This is original code however I have rewritten this as below 
  x=x;
  x++;
  printf("x : %d\n",x); //prints 101
  return 0;
}

如你看到的

x=x++;

可以改写为

x=x;
x++;

因此结果不足为奇......

于 2013-05-14T16:48:08.203 回答
0

x 有效地将其分配给 后,您正在递增x

有效地x=x++变成(assign x to x prior to increment) then (increment x)

这将产生与您要编写相同的效果:

x = x;
++x; // Increment after the assignment

x=x++;这应该在该行之后将 x 保留为 101 。

于 2013-05-14T16:27:59.090 回答
0

您正在增加x您正在打印的相同 - 在这里无论是后增量还是预增量都无关紧要。

x=x++将产生与 相同的结果x=++x

如果您想为其分配另一个对象,请执行以下操作:

#include<stdio.h>

int main(){
        int x=100;
        int y=x++;
        printf("y : %d\n",y); //prints 100
        printf("x : %d\n",x); //prints 101
        return 0;
}
于 2013-05-14T16:30:02.917 回答
0

效果是 x 的值不会改变。

x++像这样工作:

  1. 参考价值。
  2. 分配一个新整数并将值存储到其中。
  3. 增加参考。
  4. 返回临时整数。

在 C++ 中,它看起来像这样:

int PostIncrement(int& x)
{
    int y = x;
    x = x + 1;
    return y;
}

运算符优先级不会以这种方式丢失,并且赋值是在递增之后完成的。

于 2013-05-14T17:04:29.837 回答