C#

时间:2015-06-02 08:24:31

标签: 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"

你能解释一下吗?

3 个答案:

答案 0 :(得分:2)

当然 - 这是一个简单的优先事项。 (Microsoft)C#规范列出了7.3.1节中的运算符优先级(无论如何,在C#4和C#5规范中;它在C#3规范中是7.2.1),尽管这只是一个信息丰富的表 - 它实际上由语法。

无论如何,null-coalescing运算符(??)的优先级低于二进制加法运算符(+),所以你的第一个代码相当于:

int? i = 1;
int j = i ?? (2 + 1);

由于i的值非空,因此甚至不评估空合并运算符的右手操作数 - i ?? (2 + 1)的结果仅为1.

将其与第二个示例进行比较,其中null-coalescing运算符表达式再次计算为1,但随后将1添加到该结果中。这是有效的:

int tmp = i ?? 2; // tmp is now 1
int j = tmp + 1;  // j is 2

关联性在这里是无关紧要的,它只控制在两个具有相同优先级的运算符之间出现操作数时的排序/分组。

答案 1 :(得分:1)

如果不使用??运算符

,也许您会更好地理解它

情景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

答案 2 :(得分:0)

SpMx

现在j是1

int? i = 1;
int j = i ?? 2 + 1; //If I is null make j = to 3

现在j是2