[英]Operator precedence and associativity in C#
我有兩行編碼,如下所示
int? i = 1;
int j = i ?? 2 +1;
now "j is 1"
int? i = 1;
int j = (i ?? 2) +1;
now "j is 2"
你能解釋一下嗎?
當然-這只是一個優先事項。 (Microsoft)C#規范在7.3.1節中列出了運算符的優先級(無論如何,在C#4和C#5規范中;在C#3規范中為7.2.1),盡管這實際上只是一個信息量大的表-它實際上受語法。
無論如何,空值運算符( ??
)的優先級低於二進制加法運算符( +
)的優先級,因此您的第一個代碼等效於:
int? i = 1;
int j = i ?? (2 + 1);
由於i
的值不為null,因此甚至不評估null運算符的右操作數i ?? (2 + 1)
的結果i ?? (2 + 1)
i ?? (2 + 1)
只是1。
將其與您的第二個示例進行比較,在該示例中,null-coalescing運算符表達式再次求值為1,然后將1加到該結果中。 有效的是:
int tmp = i ?? 2; // tmp is now 1
int j = tmp + 1; // j is 2
關聯在這里無關緊要,只有在操作數出現在兩個具有相同優先級的運算符之間時,它才控制順序/分組。
方案1:
int? i = 1;
int j;
if (i != null)
{
//i is not null so this is hit
j = i;
}
else
j = 2 + 1;
}
所以j = 1
方案2:
int? i = 1;
int j;
if (i != null)
{
//i is not null so this is hit
j = i;
}
else
j = 2;
}
所以j = 1
//No matter the result of the above if, 1 is always added.
j = j + 1;
所以j = 2
int? i = 1;
int j = i ?? 2 + 1; //If I is null make j = to 3
現在j是1
int? i = 1;
int j = (i ?? 2) + 1; //If I is null make j = 2 else make j = to 0 and then add 1
現在j是2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.