我有一个while循环遍历字符串,直到它达到多个字符。
while (json[z-2] != 's' && json[z] != ':')
{ z++; }
我认为&&
表示AND,这应该循环,直到它到达字符串中s
和:
个字符相距1个字符但在第一个字符停止的位置:
。
尝试使用||
并且它有效,但我想知道原因。
希望这一切都清楚。
答案 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} ");
0
和countEven
都会获得countOdd
,因为函数isEven(2)
和isOdd(1)
永远不会被调用。
将其更改为:
var expression = (a==4) & (isEven(2) | isOdd(1));
并且将调用这些函数,因此countEven
和CountOdd
正在递增。
当然,应该避免副作用(如上所示),但我希望现在差异很明显。