后递减运算符

时间:2015-11-02 09:48:34

标签: c decrement

有些正文请告诉我x之后的价值是什么(用c语言表示)

x=1;

x=x--&&++x;

我认为它应该为0,因为x&&++x将给出1并且减少后将使其为0。

但是当我在计算机上输入此结果时,结果为1。 为什么后期减少不起作用。

我这样想:

预增量的优先级高于&&因此,两个x都应被视为2(布尔值为true),因此x&& ++ x将给出1,后递减应将其递减为0.

这不是一个重复的问题,因为这不是未定义行为的情况,它关于后递减的工作原理。

3 个答案:

答案 0 :(得分:9)

x=x--&&++x;

这导致未定义的行为,因为x的值在两个序列点之间被多次更改。

表达式x-- && ++x定义明确,因为&&具有内部序列点,但是当您将其分配给x时,会导致未定义的行为。

因此,表达式表现出不确定的行为。

  

C99§6.5:“2。在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,先前的值应该是只读的,以确定要存储的值。“

答案 1 :(得分:1)

由于(x--)&&(++x);short circuit evaluation的结果已明确定义。

您的作业结果  x = (x--)&&(++x);

一个更简单的例子是:

x = x--;

正如Paul和Art在评论中所说的那样:

  

在没有a的情况下在同一个表达式中修改x的值两次   修改之间的序列点。

编辑:修复了我的初始错误答案,其中说明了作业的结果已定义。

答案 2 :(得分:-2)

尽管我的大学有考试,但我无法停止思考这个问题,我想我终于找到了解决方案。

首先,后递减运算符将在&&的左边执行,它会将x的值减小为0,但x--将为1(前一个值为x),因为左边是1右侧将在此执行++ ++将值1分配给x,++ x的值也将为1,因此&&运算符将返回值1.现在,虽然预增量运算符和赋值运算符之间没有序列点,但它们都将值1分配给x,因此完全定义了在执行整个代码后x的值将为1。