【问题标题】:Ternary operator and increment operator三元运算符和增量运算符
【发布时间】:2015-08-25 15:35:01
【问题描述】:

如果不满足条件,这是重置计数器的有效/合理方式吗?这是我能想到的最紧凑的方式。

int counter = 0;
int a,b;

// Do .. and assign a and b 

counter = ((a<b) ? counter++ : 0); 

【问题讨论】:

  • 我们的目标应该是尽可能以最可维护的方式而不是最紧凑的方式编写。
  • 您也可以考虑重置或递增counter,无论您要设置condition。

标签: c++ ternary-operator


【解决方案1】:

您已经分配给counter,所以也不要使用++。

counter = condition ? (counter + 1) : 0;

【讨论】:

  • 产生的结果不一样吗?
  • 没有。 counter++ 计算出counter 的当前 值,然后将其递增。递增后,您会将 counter 的旧值分配回 counter。我认为你可以使用++counter作为一个难以阅读但正确的变体,但简单地使用无副作用的counter + 1会更清楚。
  • 如果想写出真正花哨的代码,就做 counter += condition * 1;
  • @chepner:您可能将 counter 的旧值分配回 counter,或者您可能将 42 分配给它。是UB,我很确定i = ++i也是UB。
  • 我意识到对 RHS 有多种副作用是 UB(例如,x = i++ + ++i),但不记得 RHS 是否被定义为在分配给 LHS 之前进行全面评估。我想说的是,即使定义明确,也要避免混淆。
【解决方案2】:

counter = (condition ? counter++ : 0); 的行为未定义,因为没有排序点。 (三元没有排序,赋值也没有)。

形式类似于i = i++;

【讨论】:

  • 您能详细说明一下吗?我确定右手操作是在分配之前进行的?
  • 你的版本没有重置counter;这只是一个无操作。
  • 糟糕。希望我的老板没有看到。
  • 等等,counter += 0 不会有任何变化,如果不满足条件,我需要将 counter 设置为 0
猜你喜欢
  • 1970-01-01
  • 2013-06-28
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多