新手问题:在C#中,我如何设置一组条件,其中一个条件必须是两个值或条件一起真实,而不仅仅是其中一个。例如,是以下有效语法:
if ( (x && y) || y || z) { do this;}
答案 0 :(得分:4)
如果所涉及的所有标识符都是bool
标识符,则它是有效语法,表示局部变量,参数,常量,字段或包含bool
值的属性。如果他们不是,那么不,那不是合法的语法。
我也只是指这一部分:
if ( (x && y) || y || z) { do this;}
^----------------------^
最后一部分:{ do this; }
不是法律语法,但我理解你的问题不是关于那部分。
具体来说,你的整个陈述都说明了这一点:
x && y
必须为真y
必须是真的z
必须是真的如果其中任何一个成立,那么“做这个”,无论可能是什么。
现在,让我们进一步分析你的表达。
由于y
独立,因此涉及x
似乎没什么意义。
让我们看看这个表达式:(x && y) || y
并查看x
和y
的可能值以及结果:
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; }
现在,说完所有这些,还有一件事。我还假设x
,y
和z
是其他内容的占位符。如果x
是一种方法怎么办?那会有关系吗?
是的,因为要知道x()
的结果,必须调用该方法。如果调用该方法的副作用不仅仅是返回true
或false
,那么您很可能不只想删除它。表达式的最终结果不会取决于x
的值,但可能有必要保证副作用。也许是可疑的设计,但如果没有更具体的东西,这很难说清楚。
答案 1 :(得分:2)
是。它是有效的语法。
(我假设:(1)x,y和z在某处定义;以及(2)“do this;”是测试通过时你想要执行的伪代码。{{1} }和do
都是C#关键字,但这似乎不是你的意图)
更新:添加了下面的小提琴源
this
答案 2 :(得分:0)
你可以通过更好地研究opertors precedence and associativity来回答你的问题。无论如何,布尔运算&&
的优先级高于||
。
如果x
,y
和z
是布尔变量,那么您编写的表达式是正确的。这是因为c#与C / C ++不同,它不允许将任何类型转换为bool(即任何不同于零的东西,都是真的),因为C#在if
条件中仅使用布尔表达式作为参数。