有些正文请告诉我x之后的价值是什么(用c语言表示)
x=1;
x=x--&&++x;
我认为它应该为0,因为x&&++x
将给出1并且减少后将使其为0。
但是当我在计算机上输入此结果时,结果为1。 为什么后期减少不起作用。
我这样想:
预增量的优先级高于&&因此,两个x都应被视为2(布尔值为true),因此x&& ++ x将给出1,后递减应将其递减为0.
这不是一个重复的问题,因为这不是未定义行为的情况,它关于后递减的工作原理。
答案 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--;
在没有a的情况下在同一个表达式中修改x的值两次 修改之间的序列点。
编辑:修复了我的初始错误答案,其中说明了作业的结果已定义。
答案 2 :(得分:-2)
尽管我的大学有考试,但我无法停止思考这个问题,我想我终于找到了解决方案。
首先,后递减运算符将在&&的左边执行,它会将x的值减小为0,但x--将为1(前一个值为x),因为左边是1右侧将在此执行++ ++将值1分配给x,++ x的值也将为1,因此&&运算符将返回值1.现在,虽然预增量运算符和赋值运算符之间没有序列点,但它们都将值1分配给x,因此完全定义了在执行整个代码后x的值将为1。