为什么分配时X的值不增加

时间:2019-05-12 13:06:17

标签: c

我是C语言的新手,我不太确定为什么在第4行上完成后增量后x的值不会改变我的意思

x = printf("%d",x++);

x的值为12,因此printf将打印12,然后应将x分配给2,而++x之后应使用2+1进行更改,并在第6行进行预增量,因此输出不应为124

为什么没有在第4行添加x?

请帮助。

#include <stdio.h>

int main(){

int x = 12;

x = printf("%d", x++);

printf("%d", ++x);

return 0;

}

4 个答案:

答案 0 :(得分:2)

使自己意识到顺序点。来自this [我的重点]

  

在评估所有函数自变量和函数指定符之后,以及在实际函数调用之前之前,都有一个序列点。

来自this [我的重点]

  

增量运算符会引发将适当类型的值1添加到操作数的副作用。减量运算符会产生从操作数中减去适当类型的值1的副作用。与其他任何副作用一样,这些操作在下一个序列点或之前完成

看这句话:

AnagraficaClienti client = anagraficaClientiRepository.findById(...);
client.getWorkOrders().add(newWorkOrder);

后置递增运算符将操作数的值增加x = printf("%d", x++); ,但表达式的值是递增操作之前操作数的原始值
因此,传递给1的{​​{1}}的值将是其原始值x,并且由于序列点,在调用printf()之前,12的值将增加printf()x的返回值将分配给1,后者将覆盖printf()的最后一个值,该值是由于后置x运算符而增加的值。因此,在此语句之后,x的值为++

答案 1 :(得分:1)

  

x的值为12,因此printf将打印12,然后将x分配给2,而在++那里,x应该稍后用2 + 1进行更改,并在第6行进行预增量,因此输出不应就是124。

不,毕竟涉及printf("%d", ++x);的分配已经完成,您的代码等效于:

#include <stdio.h>

int main(){
  int x = 12;

  int y = printf("%d", x++);

  x = y;

  printf("%d", ++x);

  return 0;
}

所以x = printf("%d", ++x);做到了:

  • printf 写12
  • 然后 x 递增到值13
  • 然后将 x 赋给 printf 值为2的结果

然后在 x 的值之前为2的情况下执行printf("%d", ++x);,因此 x 会先递增,然后再给参数赋值,所以写3。

,最终打印结果为123

PS。正如@ H.S。所说换句话讲:在所有函数参数的求值之后(x ++是printf()的参数),有一个序列点,并且前/后递增/递减操作在下一个序列点或之前完成。

答案 2 :(得分:-1)

这将为您工作:

++ x 是前缀增量,而 x ++ 是后缀增量,这是两者的区别:

前缀增量在变量增加后返回其值。

另一方面,更常用的后缀增量在变量增加之前返回变量的值。

#include <stdio.h>

int main()
{
    int x = 12;

    x = printf("%d", ++x);

    printf("%d", ++x);

    return 0;
}

答案 3 :(得分:-1)

x = printf(“%d”,x ++); 这大约是该整数的大小。 x ++在printf中,它正在打印x的值并将该值增加一。但这不会影响该整数的大小。然后,将x的大小分配给x而不是值。这就是为什么增量文件在那里不起作用的原因。

我想你能理解我的意思。