是
while (k >= 0 && arr[k] > 0)
安全?
当k在范围内并且arr [k]>时它循环。但是如果这是编码的好习惯,我不会这样做。我知道如果我们这样做
while (arr[k] > 0 && k >= 0)
将是一场灾难。
答案 0 :(得分:6)
&&
短路是安全的。如果k
小于零,则不会使用它将arr
编入索引。
可能不安全,因为while循环的主体可能没有正确递减k
,导致无限循环。如果k
超出arr
的范围,则可能不安全。
答案 1 :(得分:4)
您还应该关注数组大小:
while (k >= 0 && k < arr.length && arr[k] > 0)
将是一个更安全的代码。
答案 2 :(得分:3)
是的,这是一个很好的做法。实际上,这是发明短路&&
运算符的部分原因。运算符从左到右计算其子表达式,并在找到错误的子表达式时停止。这正是你想要的; &&
运算符允许您在一行中表达。
答案 3 :(得分:0)
表达式k >= 0 && arr[k] > 0
是安全的,它确保只使用arr[k]
的正数索引(因为&&
快捷方式k < 0
的值,而不是在这些情况下评估第二个操作数arr[k] > 0
。
但请注意无法保证指数超出范围(例如k >= arr.length
)。
我通常更喜欢for
循环,即:
if (arr!=null)
for (var k=0; k<arr.length && arr[k] > 0; k++) { ... }
这相当于(如果您更喜欢使用while
):
if (arr!=null) {
var k=0;
while (k<arr.length && arr[k] > 0) { ... k++; }
}
注意该数组也可以为null,因此检查。同样重要的是你要记住这个命令:
例如,如果arr
为null
,则可以跳过循环,因为数组中没有元素。如果超出数组长度(即k>=arr.length
),则不再检查arr[k] > 0
(从而避免发生异常)。
您可能已经听过&&
的“快捷方式”和||
的“快捷方式”,这是C,C ++,C#和Java语言的典型特征(VB.NET有它也是,但在这里它被命名为OrElse
,AndAlso
)。
<强>ñ。 B。 - 有关C#中的逻辑运算符(&
,&&
,|
,||
)的更多信息:
在某些情况下但是,您还需要“非快捷方式”版本&
。假设您要将字符串数组转换为整数数组,并且您希望转换每个可以转换的值,即使某些值不能转换为整数(其他值应保持为0) - 如下面的示例: 强>
void Main()
{
var sArr = new string[] {"4", "2", "x", "y", "10", "11"};
var iArr = new int[sArr.Length];
bool bCheck = true;
for (var i=0; i<sArr.Length; i++)
{
int value=0;
// need to use & instead of && here:
bCheck = bCheck && int.TryParse(sArr[i], out value);
iArr[i]=value;
};
if (bCheck==true)
{
Console.WriteLine("All numbers are okay.");
}
foreach (var n in iArr) Console.Write(n.ToString() + " ");
Console.WriteLine();
}
此代码的目的是将字符串数组中的值逐个转换为int并将它们存储在整数数组中 - 如果元素不包含有效整数,则它会存储值0。
我们得到的输出是
4 2 0 0 0 0
这不是我们所期望的,因为10和11也是有效整数并且应该被转换,而不是我们得到0和0。
获得我们期望的结果,即
4 2 0 0 10 11
我们需要将&&
替换为&
,如下所示:
bCheck = bCheck & int.TryParse(sArr[i], out value);
这有什么区别?
好吧,如果您在上面的语句中使用&&
,那么只要bCheck评估为false,就会完成快捷方式 - 这通常是正确的,因为那时我们不必检查任何表达式更多,因为不可能被评估为真。
但也会发生的是,由于我们有快捷方式,int.TryParse
不再被调用,因此值不会从函数中传出 - 循环中的所有后续调用将评估为0,而不管值是多少包含在sArr[i]
。
这是我们在这里出现的意外副作用,可以通过强制评估每个表达式(使用&
)来修复。