C#与||的逻辑比较或者&&

时间:2016-07-07 12:31:07

标签: c# arrays logical-operators

我有一个while循环遍历字符串,直到它达到多个字符。

while (json[z-2] != 's' && json[z] != ':')
{ z++; }

我认为&&表示AND,这应该循环,直到它到达字符串中s:个字符相距1个字符但在第一个字符停止的位置:

尝试使用||并且它有效,但我想知道原因。

希望这一切都清楚。

2 个答案:

答案 0 :(得分:2)

这只是逻辑:只有当两个部分都是and时,由true组合的整个表达才是true

因此,当你的循环遇到第一个:字符时,表达式为false并且循环已停止。

根据您的说明,您的代码应该是

while (!(json[z-2] == 's' && json[z] == ':'))
{ z++; }

或等效

while (json[z-2] != 's' || json[z] != ':')
{ z++; }

答案 1 :(得分:0)

在C#中有两种运算符:

  • 快捷键操作符&&||
  • 按位运算符&|

一旦操作结果清除,快捷键操作符就会跳过表达式的其余部分,这意味着:

  • for AND:如果表达式的任何部分评估为false

  • ,则评估为false
  • 对于OR:如果表达式的任何部分评估为true

  • ,则评估为true

与此行为相反,按位运算符始终评估整个表达式。对于大多数情况,快捷操作符运行良好,并且可以节省时间,如果经常评估复杂表达式(例如在大循环内)。

但有时,你必须使用按位运算符,特别是如果被调用的函数有副作用(它们也用于二进制按位计算,但这里不讨论)。

示例:

int countEven = 0;
int countOdd = 0;

bool isEven(int x)
{
    countEven++;
    return (x % 1)==0;
}


bool isOdd(int x)
{
    countOdd++;
    return (x % 1) != 0;
}

现在,如果你有

    var a=5;
    var expression = (a==4) && (isEven(2) || isOdd(1));
    Console.WriteLine($"Expression result: {expression}");
    Console.WriteLine($"Even calls: {countEven}, Odd calls: {countEven} ");

0countEven都会获得countOdd,因为函数isEven(2)isOdd(1)永远不会被调用。

将其更改为:

    var expression = (a==4) & (isEven(2) | isOdd(1));

并且将调用这些函数,因此countEvenCountOdd正在递增。

当然,应该避免副作用(如上所示),但我希望现在差异很明显。