C# 如果((x&;y)| | | | | | | z){做这个;},你能写吗?

C# 如果((x&;y)| | | | | | | z){做这个;},你能写吗?,c#,C#,新手问题:在C#中,我如何设置一组条件,其中一个条件必须是两个值或两个条件同时为真,而不仅仅是其中一个。例如,以下语法是否有效: if ( (x && y) || y || z) { do this;} 对。这是有效的语法 (我假设:(1)x、y和z在某个地方被定义;(2)“do this;”是测试通过时您想要执行的伪代码。do和this都是C#关键字,但这似乎不是您的意图) 更新:在下面添加了小提琴来源 public class Program { public st

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

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

对。这是有效的语法

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

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

public class Program
{
    public static void Main()
    {
        bool[] booleanDomain = new bool[]{ false, true };
        foreach(bool x in booleanDomain)
            foreach(bool y in booleanDomain)
                foreach(bool z in booleanDomain)
                    Test(x,y,z);

    }

    static void Test(bool x, bool y, bool z){
        bool result;
        if ( (x && y) || y || z) { 
            Console.WriteLine("the expression \"(x && y) || y || z\" is true when: \nx={0} \ny={1} \nz={2}\n", x, y, z);
        }
    }
}

如果所涉及的所有标识符都是
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
的值,但可能会产生任何副作用。也许设计有问题,但如果没有更具体的东西就很难说出来。

你的问题可以通过更好的学习来回答。无论如何,布尔运算
&&
的优先级高于
|

如果
x
y
z
是布尔变量,那么您编写的表达式是正确的。这是因为与c/c++不同的是,c#不允许将任何类型转换为bool(即与零不同的任何类型,为true),因为c#在
if
条件中仅使用布尔表达式作为参数。

为什么不自己编译程序呢?:)首先,您可以尝试一下,编译器会很容易地告诉您它的语法是否有效。第二,是的,你可以做到。这是有效的语法。我会要求您考虑编写代码略有不同,但是,给表达式一个名称,把它存储到一个本地变量,这样更容易读取代码后,当你不必猜测为什么这些表达式检查。例如:
boolcansavetodisk=(x&&y)| y | z;如果(canSaveToDisk){do this;}
如何将一组条件放在哪里?其中一个条件必须是两个值?除非它们是布尔值。。。你能用英语重新表述你的问题吗?我们看不懂你的心思。我真的不明白人们为什么要回答这个问题…@GrantWinney实际上,目的是通过条件检查,如果Y单独是真的,或者X和Y一起是真的,但如果X单独是真的,则不通过条件检查。这就是为什么Y被添加到X,但它仍然可以自己通过。现在有意义了吗?如果
y
必须是真的,那么检查
x&&y
也没有意义(除非
x
有副作用,但这会很奇怪:-))。但这是正确的答案,+1我还没有发布完我的答案。请重新阅读我现在更新的答案,看看是否有遗漏。拉丝,非常感谢。这正是我想知道的。我不知道为什么人们在拉选票@Jcl实际上,目的是通过条件检查,如果Y单独为真,或者X和Y一起为真,但如果X单独为真,则不通过条件检查。这就是为什么Y被添加到X,但它仍然可以自己通过。现在有意义了吗?是的,但是X仍然不重要。如果Y是真的,那么X是真是假一点也不重要。@Lasse现在好多了:-)而且-看起来其他人都在告诉你自己编译和运行它。如果这不是一件容易的事情,你要做的设置为小提琴单独,+1。你应该把它包括在回答中,谢谢你;你对我意图的假设和理解是正确的。谢谢你的链接。你又对了;我不是在编译,而是在编辑一个现有的.cs文件,不知道如何测试其有效性,但是通过这个链接,如果我理解的话,也许我可以。