如何减少表达

时间:2016-11-28 15:51:47

标签: c syntax ternary-operator conditional-operator

如何减少表达?如果我是对的,如果只有x = 0,则x指定0;否则x指定1.但是,它如何缩短?

 x = (x = 0) ? 0 : 1

3 个答案:

答案 0 :(得分:7)

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

x = !!x;

说明:

如果x0!x1,则!!x0
如果x不是0!x0,那么!!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 会产生副作用所以在这种情况下没有定义行为。