如何减少表达
How to Reduce the expression
如何减少表达量?如果我是对的,如果只有 x = 0,x 赋值为 0;否则 x 赋值 1。但是,它如何缩短?
x = (x = 0) ? 0 : 1
假设您的意思是 x == 0
,这很短:
x = !!x;
解释:
如果x
是0
,!x
是1
,所以!!x
是0
。
如果 x
不是 0
,!x
是 0
,那么 !!x
是 1
。
如果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 类别条件检查。
如何减少表达量?如果我是对的,如果只有 x = 0,x 赋值为 0;否则 x 赋值 1。但是,它如何缩短?
x = (x = 0) ? 0 : 1
假设您的意思是 x == 0
,这很短:
x = !!x;
解释:
如果x
是0
,!x
是1
,所以!!x
是0
。
如果 x
不是 0
,!x
是 0
,那么 !!x
是 1
。
如果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 类别条件检查。