当前位置: 首页 > 面试题库 >

Swift三元运算符编译错误

国景铄
2023-03-14
问题内容

为什么会产生错误,应如何写?

    let x = 5
    let y = 4
    var z:Int
    x < 4 ? z = 6 : z = 8

错误是“找不到<接受提供的参数的重载”


问题答案:

您的三元运算符在那里不工作的 原因
是由于各种中缀运算符的优先级。您可以在此处查看运算符优先级列表。如果您看一下,会发现底部的运算符通常是放置在较大代码段之间的运算符。优先级越高,它将越紧紧抓住左侧(或右侧)的表达式。因此,您通常希望您的=运算符具有非常低的关联性,因此在类似以下的表达式中:

let x = 2 + 3

+会抢在它两侧的两个操作数 之前=意志,所以它解析为:

let x = (2 + 3)

而不是这样的:

(let x = 2) + 3

这没有什么意义。

三元条件运算符的优先级为100,而=运算符的优先级为90。因此,在您的示例中,当您具有以下条件时:

x < 4 ? z = 6 : z = 8

关联性如下所示:

x...
x < ...
x < 4 // precedence 130, so resolves
(x < 4)...
(x < 4) ?...
(x < 4) ? z...
(x < 4) ? z = ... // Does not yet resolve. Why? Well, here, the ternary isn't 
                  // really an infix. It is special kind of operator that 
                  // takes something between ? and :. So normal associativity
                  // doesn't apply. (I'm still experimenting...)
(x < 4) ? z = 6 : ...
(x < 4) ? z = 6 : z // HERE it resolves. The z is grabbed, as the ternary has 
                    // precedence 100, larger than the 90 precedence of the =
((x < 4) ? z = 6 : z) = 8

因此,由于三元运算符的优先级高于赋值运算符的优先级,因此它会“抢占” z,然后在找到=时就会感到困惑。编译器看到的内容如下所示:

if (x < 4) { z = 6 } else { z } = 8... // Compiler has a hissy fit

那么如何解决呢?

x < 4 ? (z = 6) : (z = 8) // x < 4 ? z = 6 : (z = 8) works as well

括号使关联性明确。为什么首先以这种方式工作?好吧,通常您使用三元运算符将其解析为表达式(就像@LeoDabus的答案一样)。而在这种情况下,其关联性意味着你
并不 需要括号:

let z = x < 4 ? 6 : 8
let z...
let z = ...
let z = x ...
let z = x < 4 // < has precedence 130, bigger than =
let z = (x < 4) ? // ? has precedence of 100, bigger than =
let z = if (x < 4) { 6 } else { 8 }

我希望这会有所帮助并且有意义。(我可能弄错了一些优先顺序的解释,我觉得很困惑)

事实证明,我确实对某些优先级解释有误。如果我的解释是正确的,那是行不通的:

x < 4 ? z = 6 : (z = 8)

但是可以!事实证明,优先级问题发生 运算符之后,而不是之前。(我在上面解释了更多)

此外,带有花括号的实际if语句本身 不会 解析为表达式。所以这不起作用:

let z = if (x < 4) { 6 } else { 8 }


 类似资料:
  • 问题内容: 我在编写一些Java代码时遇到了编译失败,我将其简化为以下测试用例: 上面的代码无法使用JDK 1.7.0_45 进行编译: 但是,使用JDK 1.8.0_05编译时不会出现任何错误。 这是Java 7实现中的错误吗?还是对Java 8中的Java语言规范进行了增强以开始允许这样做-如果是这样,有什么变化? 问题答案: JLS SE 8在(§15.2)中说: 当某些表达式出现在某些上下

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

  • 问题内容: 如何用elseif部分编写PHP三元运算符? 我看到了带有PHP三元运算符和的基本示例,如下所示: 我如何将这样的“ elseif”部分放入三元运算符中? 问题答案: 三元不是您想要的一个很好的解决方案。它不会在您的代码中可读,并且有很多更好的解决方案可用。 为什么不使用数组查找“ map”或“ dictionary”,如下所示: 此应用程序的三元最终看起来像这样: 为什么这样不好?因

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

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