簡體   English   中英

C#中的運算符優先級和關聯性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM