你可以写if((x&& y)|| y || z){do this;}?

时间:2016-04-16 19:10:39

标签: c#

新手问题:在C#中,我如何设置一组条件,其中一个条件必须是两个值或条件一起真实,而不仅仅是其中一个。例如,是以下有效语法:

if ( (x && y) || y || z) { do this;}

3 个答案:

答案 0 :(得分:4)

如果所涉及的所有标识符都是bool标识符,则它是有效语法,表示局部变量,参数,常量,字段或包含bool值的属性。如果他们不是,那么不,那不是合法的语法。

我也只是指这一部分:

if ( (x && y) || y || z) { do this;}
^----------------------^

最后一部分:{ do this; } 不是法律语法,但我理解你的问题不是关于那部分。

具体来说,你的整个陈述都说明了这一点:

  • x && y必须为真
  • y必须是真的
  • z必须是真的

如果其中任何一个成立,那么“做这个”,无论可能是什么。

现在,让我们进一步分析你的表达。

由于y独立,因此涉及x似乎没什么意义。

让我们看看这个表达式:(x && y) || y并查看xy的可能值以及结果:

   x   |   y   |   result  |  why?
---------------------------------------------
 false | false | false     | because neither x nor y is true
 false | true  | true      | because y is true: ... ? || y
 true  | false | false     | because y has to be true either way
 true  | true  | true      | because y is true: ... ? || y

基本上,您可以完全删除x,但它与结果无关(请参阅下面的额外评论)。

你的最终陈述可能是这样的:

if (y || z) { do this; }

现在,说完所有这些,还有一件事。我还假设xyz是其他内容的占位符。如果x是一种方法怎么办?那会有关系吗?

是的,因为要知道x()的结果,必须调用该方法。如果调用该方法的副作用不仅仅是返回truefalse,那么您很可能只想删除它。表达式的最终结果不会取决于x的值,但可能有必要保证副作用。也许是可疑的设计,但如果没有更具体的东西,这很难说清楚。

答案 1 :(得分:2)

是。它是有效的语法。

(我假设:(1)x,y和z在某处定义;以及(2)“do this;”是测试通过时你想要执行的伪代码。{{1} }和do都是C#关键字,但这似乎不是你的意图)

更新:添加了下面的小提琴源

this

答案 2 :(得分:0)

你可以通过更好地研究opertors precedence and associativity来回答你的问题。无论如何,布尔运算&&的优先级高于||。 如果xyz是布尔变量,那么您编写的表达式是正确的。这是因为c#与C / C ++不同,它不允许将任何类型转换为bool(即任何不同于零的东西,都是真的),因为C#在if条件中仅使用布尔表达式作为参数。