Swift编程入门疑问:为何代码执行了错误的分支?
你的代码输出不符合预期,核心原因是Swift逻辑运算符的优先级——&&的优先级比||高,导致条件判断的逻辑和你预想的不一样。
看你的变量值:subjectOne = true,subjectTwo = false,subjectThree = 5。
第二个else if的条件是:
subjectOne || subjectTwo && subjectThree >= 10
因为&&优先级更高,会先计算subjectTwo && subjectThree >=10(结果是false && false = false),然后再算subjectOne || false,结果是true,所以这个分支被触发,输出了"Almost perfect..."。
而你想要触发的分支是else if subjectOne || subjectTwo && subjectThree < 10,同样因为优先级问题,这个条件会被解析成subjectOne || (subjectTwo && subjectThree <10),结果也是true,但因为前面的分支已经匹配到了,所以根本不会走到这里。
修正方案
给逻辑判断加上括号,明确分组逻辑,让代码按照你预想的顺序执行:
var subjectOne = true var subjectTwo = false var subjectThree: Int = 5 func shout(subjectOne: Bool, subjectTwo: Bool, subjectThree: Int){ if subjectOne && subjectTwo && subjectThree >= 25 { print("HIGH SCORE!") } // 加上括号明确:(subjectOne 或 subjectTwo) 并且 subjectThree >=10 else if (subjectOne || subjectTwo) && subjectThree >= 10 { print("Almost perfect. Give it another try!") } else if subjectOne && subjectTwo && subjectThree >= 10 { print("There ya' go!") } else if !subjectOne && !subjectTwo && subjectThree >= 10 { print("Well, you got a high enough number at least!") } // 加上括号明确:(subjectOne 或 subjectTwo) 并且 subjectThree <10 else if (subjectOne || subjectTwo) && subjectThree < 10 { print("Well, you got one correct") } else if !subjectOne && !subjectTwo && subjectThree < 10 { print("You fail at life!") } // 加上括号明确:(subjectOne 或 subjectTwo) 并且 subjectThree >=25 else if (subjectOne || subjectTwo) && subjectThree >= 25 { print("Almost a high score. Keep going, you got this!") } } shout(subjectOne: subjectOne, subjectTwo: subjectTwo, subjectThree: subjectThree)
修正后,第二个else if的条件会先判断subjectOne || subjectTwo(结果是true),再判断true && subjectThree >=10(5>=10是false,所以整个条件为false),这样就会跳过这个分支,走到你想要的(subjectOne || subjectTwo) && subjectThree <10分支,输出预期的内容。
另外,建议写条件判断时,只要涉及到||和&&混合的情况,都加上括号,不仅能避免优先级问题,还能让代码逻辑更清晰,方便自己和其他人阅读。
内容的提问来源于stack exchange,提问作者Brian

