如何减少表达?如果我是对的,如果只有x = 0,则x指定0;否则x指定1.但是,它如何缩短?
x = (x = 0) ? 0 : 1
答案 0 :(得分:7)
假设您的意思是x == 0
,这很短暂:
x = !!x;
说明:
如果x
为0
,!x
为1
,则!!x
为0
。
如果x
不是0
,!x
是0
,那么!!x
就是1
。
如果有意x = 0
,则代码未定义。
但是你可以制作一个定义明确的短版本,我认为它可以捕捉到作者的意图:
x = 1;
因为x = 0
的值为0
。
答案 1 :(得分:3)
将所有假设部分放在一边,首先让我清楚说明,此处没有未定义的行为。
引用C11
,章节§6.5.15,条件运算符(强调我的)
评估第一个操作数;它的评价和评价之间有一个序列点 评估第二个或第三个操作数(以评估者为准)。第二个操作数 仅当第一个比较不等于0时才计算;第三个操作数仅在以下情况下进行评估 第一个比较等于0;结果是第二个或第三个操作数的值 (无论哪个被评估),[....]
然后,将结果分配给外部赋值运算符的LHS。
声明,
x = (x = 0) ? 0 : 1;
相当于
x = 1;
当x= 0
最终评估为FALSE 无条件 。
相关,引用标准,章节§6.5.16,分配运算符,(强调我的)
赋值运算符将值存储在左操作数指定的对象中。 <强>一种 赋值表达式具有赋值后左操作数的值
注意:
表示,与问题中提到的理解相关
x如果只有x = 0,则指定0;否则x指定1
错了。给定语句中没有 if..else..then 类别条件检查。
答案 2 :(得分:0)
如果它恰好是您发布的那个,则它是未定义的行为。
表达式
x = (x = 0);
未定义,因为x = 0
在将x
分配给x
之前修改了x = x++;
,因此它表示两个子表达式之间没有序列点。你可以在这里阅读sequence point。
相当于
x = (x = 0)
许多程序员会立即将其识别为未定义的行为,即使在x = 0
中遇到同样的问题更难以查看,但webapp
+model
+view
++A1.view.xml
+controller
++A1.controller.js
+index.html
会产生副作用所以在这种情况下没有定义行为。