【问题标题】:Swift Playground Error: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)Swift Playground 错误:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)
【发布时间】:2015-11-28 04:28:45
【问题描述】:

在 Playground Xcode 7.1.1 中使用以下代码出现上述错误:

import Cocoa

func countDivisors(number:Int) -> Int
{
    var c = 0
    for i in 1 ... number
    {
        if number % i == 0 { ++c }
    }
    return c
}

func isPrime(number:Int) -> Bool
{
    return countDivisors(number) == 2
}

isPrime(2);

for i in 0 ..< 100
{
    var f:Bool = isPrime(i)
    print("\(i): \(f)")
}

错误发生就行了

var f:Bool = isPrime(i)

我已经重新安装了 Xcode,但仍然出现错误。有谁知道这背后的原因吗?

【问题讨论】:

  • 侧节点:测试应该从 2 开始,当 i >= 数字的平方根时停止。当您测试数字 10,000 时,测试将在 1% 的时间后完成。

标签: xcode swift


【解决方案1】:

你得到“EXC_BAD_INSTRUCTION”的原因是因为for循环的范围运算符不能形成一个结束值为0的范围。你的范围运算符的结束值应该大于或等于开始值。

来自苹果文档,

封闭范围运算符 (a...b) 定义从 a 到 b 的范围,并包括值 a 和 b。 a的值不能大于b。

这会起作用

for i in 1...1 {
   //--  
}

但不是这个

for i in 1...0 {
  //--  
}

【讨论】:

    【解决方案2】:

    当调用var f:Bool = isPrime(i) 行时,i 的初始值为0,除以零得到未知值。最好把你的循环改成for i in 1 ..&lt; 100

    【讨论】:

    • 问题是零,但不是因为除以零——请参阅下面的 RP 回答了解发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2012-05-30
    • 2016-02-19
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多