【问题标题】:How to Reduce the expression如何减少表达式
【发布时间】:2017-04-12 09:59:16
【问题描述】:

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

 x = (x = 0) ? 0 : 1

【问题讨论】:

  • 这是我的家庭任务之一
  • 只是x = 1;......
  • @usr 该文本是 OP 的 假设,而不是要求,恕我直言。

标签: c syntax ternary-operator conditional-operator


【解决方案1】:

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

x = !!x;

解释:

如果x0!x1,那么!!x0
如果x不是0!x就是0,那么!!x就是1

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

但是您可以制作一个定义明确且我认为能抓住作者意图的较短版本:

 x = 1;

因为x = 0 的值是0

【讨论】:

  • 最有意思的是x=0,只有一个等号
  • 是的!我看到了你的回答,请解释一下!
  • x = 0 的计算结果为 false,因此将 : 旁边的值分配给 x
  • @molbdnilo If x = 0 is intentional, the code is undefined. 你介意详细说明吗?
【解决方案2】:

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

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

计算第一个操作数;在它的求值和 评估第二个或第三个操作数(以评估的为准)。 第二个操作数 仅当第一个比较不等于 0 时才评估;仅在以下情况下评估第三个操作数 第一个比较等于 0;结果是第二个或第三个操作数的值 (以评估为准),[....]

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

声明,

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

等价于

x = 1;

x= 0 最终评估为 FALSE无条件

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

赋值运算符将值存储在左操作数指定的对象中。 安 赋值表达式有赋值后左操作数的值,


注意:

就是说,与问题中提到的理解有关

如果只有 x = 0,则 x 赋值为 0;否则 x 赋值 1

错了。给定语句中不存在 if..else..then 类别条件检查。

【讨论】:

  • 尝试在 GCC 下编译时出现警告,它会说 warning: operation on ‘x’ may be undefined [-Wsequence-point] ...
  • @iharob 好吧,这很有趣。我想获得更多关于这方面的信息。我到底在哪里读错了标准? (我希望你不介意重新措辞,对吧?)
  • @molbdnilo 先生,我不太确定我是否在关注你,我仍然看不到最终分配是如何导致问题的。正如我们所见,条件的第一个操作数首先被求值(x 被赋值),之后,有一个序列点,然后,第三个操作数的求值,然后,获得结果,再次将其分配给相同的变量x。那么,这里的中间序列点怎么算不上呢?如果我遗漏了什么,请纠正我。
【解决方案3】:

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

表达式

x = (x = 0);

是未定义的,因为x = 0在分配给x之前修改了x,所以说两个子表达式之间没有序列点。你可以在这里阅读sequence point

相当于

x = x++;

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

【讨论】:

  • Ummm.. 不确定我是否遗漏了什么,但为什么是 UB?
  • 更具体地说,第一个和第二个/第三个操作数之间有一个 Seq 点,对吧?
  • @iharob 还是没弄明白,有序列点吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多