布尔表达式的评估顺序是什么

时间:2017-07-20 07:45:06

标签: c# boolean-expression

我一直在寻找对布尔表达式求值顺序但无法找到的解释。

看一下这句话:

if (locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0)

如何评估。
它会是这样的:

if ((locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0)

或者像这样:

if (locClsTanken.PlaceID == -1 && (locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0))

是否有一些关于此的文档我不知道正确的搜索词,因为英语不是我的语言。

我知道我可以测试它但是我想找到关于这个的文档,所以我可以完全理解它

3 个答案:

答案 0 :(得分:5)

&&的优先级高于||,因此

locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0

评估为

(locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0

请注意,&&||也会短路,因此只有在评估左手操作数后才能更改结果,才会对右手操作数进行评估。

参考:https://msdn.microsoft.com/en-gb/library/aa691323(v=vs.71).aspx

答案 1 :(得分:2)

除了&&的优先级高于||之外,表达式从左向右呈现。
因此,在您的情况下,它会像

if ((locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0)

你正在寻找的技术热量是 运营商优先 看一看link:Operators Precedence

答案 2 :(得分:2)

在C#中,编译器从左向右移动,这意味着它将首先评估最左边的表达式(在你的情况下是locClsTanken.PlaceID == -1

此外,&&的优先级高于|| - >首先得到评估

但是,令您困惑的是编译器如何处理&&||&&&之间存在差异。

&表示两个表达式都必须为true,并且两个表达式都会被计算。但是,&&仅导致首先计算一个表达式。如果第一个表达式失败,则第二个表达式甚至不被评估,因为为了使&&为真,两个表达式都需要为真。如果第一个已经失败&&总是假的 - > &&&更快,更“智能”