当前位置: 首页 > 知识库问答 >
问题:

三元运算符未按预期处理后增量

祁远
2023-03-14

所以这可能是一个愚蠢的问题,但我时不时地遇到这种语法错误,似乎无法吸取教训-因为我根本不明白为什么这不起作用。

由于某种原因,三元运算符不能处理增量或减量。

在控制台中,我发现了这些结果:

  // Firstly
var iteration = undefined; 

  // Expected increment, unexpected result
iteration = iteration == undefined ? 0 : iteration++;  //returns 0 every time

  // Then I thought maybe ternary doesn't return assignments
iteration = iteration == undefined ? 0 : iteration+=1; //increments iteration

  // Works as expected
iteration = iteration == undefined ? 0 : iteration+1;  //increments iteration

在搜索答案时,我发现另一个用户对意外行为有同样的体验。

经过更多的搜索,我发现前增量工作正常:

iteration = iteration == undefined ? 0 : ++iteration; //increments iteration

在试图确定预增量的工作原理时,遇到了这个答案。

这让我明白了为什么它能工作,而后增量不能。我想,如果三进制的操作顺序是那样的话,在某个时候,递增的值可能会被初始值覆盖,但这是我能想到的全部。

但实际上,我从后增量中获得的预期行为是返回迭代,然后对其进行迭代......后。

例如,这段代码:

var bar = undefined;
//foo is set immediately and bar is incremented after it is returned
foo = bar == undefined ? bar=0 : bar++; //sets foo to be what bar was before the increment

希望你能在这里忍受我。我确实明白,在找到了许多可靠和直接的方法来完成这项工作后,我不需要答案,但我只是困惑为什么会这样。

问题:

为什么三元运算符不更新返回的后增量(或后缀)值——在它已经被返回之后?

对这一回答的评论指出

计数器计算为计数器的当前值,然后将其递增。在递增后,您将把计数器的旧值重新分配给计数器。

但我仍然不知道为什么操作顺序会这样。

另一个有用的前递增与后递增C(具有讽刺意味的搞笑答案)

共有2个答案

曹臻
2023-03-14

在赋值表达式中,首先计算整个右侧,然后将其结果值赋给左侧。这意味着后增量表达式需要首先被求值并转换成一个值,该值随后将被分配给左侧。post increment操作符不知道它属于哪个更大的表达式。它将被自动评估。即,它不会首先返回它的值,然后完成赋值操作,然后完成后递增操作。当对表达式< code>iteration 求值时,< code>iteration的值将递增,并且该表达式会立即产生< code>iteration的原始值。

竺焕
2023-03-14

无论解释器在调用前增量或后增量的表达式上运行,都会在解析表达式之前立即重新分配变量。例如:

iteration = iteration == undefined ? 0 : iteration++;

就像

function doPostIncrement() {
  const preIncrementValue = increment;
  increment = increment + 1;
  return preIncrementValue;
}
iteration = iteration == undefined ? 0 : doPostIncrement();

此外,分配解析为值,所以

iteration = iteration == undefined ? 0 : iteration+=1; //increments iteration

就像

function addOneToIncrementAndReturnIncrement() {
  increment = increment + 1;
  return increment;
}
iteration = iteration == undefined ? 0 : addOneToIncrementAndReturnIncrement();

它实际上不是函数调用,但也没有什么不同,因为重新分配是在函数解析之前完成的,或者在前/后增量表达式解析之前完成的。

 类似资料:
  • 问题内容: 为什么要打印? 以我的理解,它应该打印。 为什么它没有按预期工作? 问题答案: 因为您编写的内容与以下内容相同: 如您所知1被评估为。 您期望的是: 因此,请始终使用大括号以避免此类混淆。 正如已经写过的,三元表达式在PHP中是关联的。这意味着首先将执行从 左边开始 的第一个,然后是第二个,依此类推。

  • 条件(三元)运算符是 JavaScript 仅有的使用三个操作数的运算符。一个条件后面会跟一个问号(?),如果条件为 truthy ,则问号后面的表达式A将会执行;表达式A后面跟着一个冒号(:),如果条件为 falsy ,则冒号后面的表达式B将会执行。本运算符经常作为 if 语句的简捷形式来使用。(MDN) 三元运算符,也称条件运算符、三目运算符。 三元运算符可以代替简单的 if 语句。 1. 语

  • 问题内容: 我正在做一些有关Java的研究,发现这很令人困惑: 这是永无止境的循环! 有人很好地解释了为什么会发生这种事情吗? 问题答案: 上面的循环与以下内容基本相同:- 3 次你的一部分声明- ,被评估为: - 您需要从此处删除分配,以使其起作用:- (根据评论的OP请求) 的行为:- 就注释中指定的问题而言,以下表达式的结果:- 获得如下:- 让我们标记第二条语句的不同部分:- 现在,首先将

  • 问题内容: 是否可以更改此: …对三元运算符? 问题答案: 好吧,中的行为就像这样…… …另一种看待它的方式… 你的问题有点含糊,我们必须在这里假设。 如果(且仅当)声明了一个返回值(,等。)-现在看来似乎没有做到这一点通过你的代码-那么你可以做到这一点… 如果callFunction(…)不返回值,那么你将无法使用三元运算符!就那么简单。你将使用不需要的东西。 请发布更多代码以清除所有问题 尽管

  • 问题内容: 是否可以在Python中一行执行此操作? 我已经尝试过三元运算符: 但是我的IDE(MyEclipse)不喜欢它,没有一个。 问题答案: 是的,您可以这样做: 如果为假,则短路将开始,并且右侧将不被评估。如果为true,则将评估右侧并添加元素。 我只是指出,执行上述操作是完全非Python的,无论如何,最好编写此代码: 示范:

  • 问题内容: 有人可以解释为什么这样的代码吗? 产生以下编译器错误: 不兼容的条件操作数类型ArrayList和HashSet 由于我不明白的原因,以下内容解决了该问题 我正在使用Java 1.4。 问题答案: 这是1.4 中的 错误 ,并已根据bugreport 5080917 进行了修复。 评估 这是一个错误。 xxxxx @ xxxxx 2004-07-30