短路运营商

时间:2014-03-25 15:03:44

标签: c#

我开始学习C#,在阅读逻辑运算符时,我发现:

|| operator表示逻辑运算符,如果表达式1为TRUE,则不计算表达式2。我很好奇这个例子:

int x = 5, y = 10;
bool result;

result = (x == 3) || (y != 5);
label12.Text = result.ToString();

如果我们已经知道X的值是5,那么结果(x == 3)如何返回true?因为在这种情况下左侧操作符返回TRUE。但是怎么样? X = 5,它应该是X == 5 ???我误解了什么?有人可以用几句话来解释我吗?

非常感谢并提前感谢

5 个答案:

答案 0 :(得分:3)

短路操作意味着这里

result = (x == 3) || (y != 5);
如果y != 5已经为真,则不会评估

x == 3部分。基本上因为没有必要 - 我们已经知道整个表达都是真的。

如果x为5,则会评估两个表达式,因为我们仍然不知道x == 3之后的整个结果。

更新。使用此示例可能会更清楚这一点的目的。考虑以下,当然简化,代码:

var someObj = SomeOperation();
if (someObj != null && someObj.IsActive)

如果SomeOperation()返回null,会发生什么?如果不对此逻辑语句进行短路评估,则此代码将抛出NullReferenceException。但是,如果IsActive为空,则不会调用someObj调用。

答案 1 :(得分:1)

它是一个或。左侧是假的,所以它评估右侧,这是真的。

答案 2 :(得分:1)

短路评估意味着当编译器确定整个表达式的结果时,编译器会立即停止评估表达式

在您的情况下,当编译器发现表达式x==3为false时,它无法停止评估,因为表达式的第二部分可能为true。

所以它被迫继续评估,它发现表达式y != 5为真,整个表达式变为FALSE || TRUE

See the C# reference

答案 3 :(得分:1)

让我们分解......

    int x = 5, y = 10;
    result = (x == 3) || (y != 5);

(x==3)是假的 (y!=5)是真的

由于您使用了 || ,条件(x==3)的第一部分为false,因此我们需要继续评估任何其他条件以确定整体表达式是true还是false ......如果第一个表达式为真,我们可以在那里停止,因为整个表达式不会随着持续评估而改变,条件的第二部分将被“短路”。

在这种情况下,必须评估(y!=5),它返回true并使表达式的其余部分为真。

如果您使用 && 来合并条件,那么如果任何一方为假,则整个表达式为false。

int x = 5, y = 10;
result = (x == 3) && (y != 5);

由于在这种情况下(x==3)为false,因此不需要进行其他评估,并且在不评估(y!=5)

的情况下将结果设置为false

答案 4 :(得分:0)

(x == 3)不应评估为True。 (x == 3)计算结果为False,因此(y!= 5)得到评估,这是真的。这就是为什么结果是真的。