while(k> = 0&& arr [k]> 0)安全吗?

时间:2012-07-17 13:56:27

标签: c# coding-style

while (k >= 0 && arr[k] > 0) 

安全?

当k在范围内并且arr [k]>时它循环。但是如果这是编码的好习惯,我不会这样做。我知道如果我们这样做

while (arr[k] > 0 && k >= 0) 

将是一场灾难。

4 个答案:

答案 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,因此检查。同样重要的是你要记住这个命令:

例如,如果arrnull,则可以跳过循环,因为数组中没有元素。如果超出数组长度(即k>=arr.length),则不再检查arr[k] > 0(从而避免发生异常)。

您可能已经听过&&的“快捷方式”和||的“快捷方式”,这是C,C ++,C#和Java语言的典型特征(VB.NET有它也是,但在这里它被命名为OrElseAndAlso)。


<强>ñ。 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]

这是我们在这里出现的意外副作用,可以通过强制评估每个表达式(使用&)来修复。