如何减少表达

How to Reduce the expression

如何减少表达量?如果我是对的,如果只有 x = 0,x 赋值为 0;否则 x 赋值 1。但是,它如何缩短?

 x = (x = 0) ? 0 : 1

假设您的意思是 x == 0,这很短:

x = !!x;

解释:

如果x0!x1,所以!!x0
如果 x 不是 0!x0,那么 !!x1

如果x = 0是故意的,则代码未定义。

但是你可以制作一个定义明确的较短版本,我相信它抓住了作者的意图:

 x = 1;

因为 x = 0 的值为 0.

如果它正是您发布的那个,那么它是未定义的行为。

表达式

x = (x = 0);

未定义,因为 x = 0 在将其分配给 x 之前修改了 x 所以说两个子表达式之间没有序列点。您可以在此处阅读有关 sequence point 的信息。

相当于

x = x++;

许多程序员会立即将其识别为未定义的行为,即使在 x = (x = 0) 中更难看到它也是同样的问题,x = 0 会产生副作用,因此行为未定义在这种情况下。

抛开所有假设部分,首先让我明确说明,这里没有未定义的行为

引用 C11,章节 §6.5.15,条件运算符强调我的

The first operand is evaluated; there is a sequence point between its evaluation and the evaluation of the second or third operand (whichever is evaluated). The second operand is evaluated only if the first compares unequal to 0; the third operand is evaluated only if the first compares equal to 0; the result is the value of the second or third operand (whichever is evaluated), [....]

然后,将结果赋值给外层赋值运算符的LHS。

声明,

x = (x = 0) ? 0 : 1;

等同于

x = 1;

因为 x= 0 最终无条件地 计算为 FALSE。

相关,引用标准,章节§6.5.16,赋值运算符,(强调我的

An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment,


注:

说的,和问题中提到的理解有关

x assign 0 if only x = 0; otherwise x assign 1

错了。给定语句中没有 if..else..then 类别条件检查。