和 的區別&&和和and的區別:||or
&&并||使用短路評估,而and并or始終評估每個條件
“和”的 Kotlin 檔案
但除此之外,對于以下示例,我得到了不同的行為:
使用&&,這個片段完美地作業:
var str1: String? = "Good Morning"
var str2: String? = "How's it going"
if (str1 != null && str2 != null) {
println(str1.length str2.length)
}
當我替換為時&&,and我必須在兩個條件周圍添加括號,否則編譯器似乎會因為我收到錯誤而感到困惑:Operator '!=' cannot be applied to 'String?' and 'BigInteger'
使用and和添加括號:
var str1: String? = "Good Morning"
var str2: String? = "How's it going"
if ((str1 != null) and (str2 != null)) {
println(str1.length str2.length)
}
但是最后一個片段拋出:
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
兩個運算式不應該完全相同嗎?評估兩個條件并僅println在兩個String值都為時執行non-null?有什么區別?
uj5u.com熱心網友回復:
&&與另外一個不同之處and在于它引入了一個智能轉換 from String?to String,允許您length通過說str1.lengthand來訪問str2.length,而不是使用str1?.lengthand str2?.length。
來自Kotlin 語言規范:
智能轉換由以下 Kotlin 結構引入。
- 條件運算式 (
if)- 當運算式 (
when);- 貓王運營商(運營商
?:);- 安全航行操作員(operator
?.);- 邏輯連詞運算式(運算子
&&);- 邏輯析取運算式(運算子
||);- 非空斷言運算式(運算子
!!);- 轉換運算式(運算子
as);- 型別檢查運算式(運算子
is);- 簡單的作業;
- 平臺特定案例:不同平臺可能會添加其他型別的運算式,從而引入額外的智能投射源。
您需要額外的括號and,因為作為中綴函式,它的優先級高于&&非中綴函式。在此處查看所有優先級。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529471.html
