退出循环

时间:2017-10-04 17:25:11

标签: c while-loop standards break

我用来检查下面代码的编码标准投诉的工具“只能从循环中退出”。它说下面的“while(len< totalLen)”循环有一个额外的退出方式。 它说“所有结构(函数,循环)都需要单入口和单出口”。我很困惑,因为它抱怨的while循环只有单一退出标准。

单一条目和单一退出条件的含义是什么?以下代码如何违反它。 while循环中的if条件是必要的。如何保留并投诉编码标准

   while (len < (totalLen))
    {

    switch (*(structAddr  + len - 1))
        {

        case CASEA:                     //8 byte data


            while (len < totalLen)
                {
                if ((*(structAddr  + len) == CASE0))                           //this means there is no 8 byte data left to swap
                    {
                    arr[len] = *(nvStruct + len);
                    break;
                    }

                arr[len]     = *(structAddr  + len + 1);
                arr[len + 1] = *(structAddr  + len);
                len          = len + 2;

                }

            break;


        case CASEB:                     //2 byte data


            while ((*(structAddr + len + 1) != CASE0) && (len < totalLen))
                {

                arr[len] = ((*(structAddr + len) << 16) & (0xffff0000)) |
                           ((*(structAddr + len) >> 16) & (0x0000ffff));
                len++;
                }

            break;


        default:                      //4 byte data - no swap needed

            arr[len] = *(structAddr + len);


        }

    len++;
    }


}

2 个答案:

答案 0 :(得分:2)

因为你的循环有条件而且如果满足另一个条件就会中断,内部 def average_grade(lst): """ Return students' names and their average grades. """ # This whole block can be replaced with this one-liner: # return [[sub[0], sum(sub[1:]) / len(sub[1:])] for sub in lst] averages = [] for sublist in lst: student = sublist[0] grades = sublist[1:] average = sum(grades) / len(grades) averages.append([student, average]) return averages >>> average_grade([['Bob', 56, 80, 72, 90], ['Alice', 60, 88, 44, 70], ['Joe', 44, 100, 80, 60, 50]]) [['Bob', 74.5], ['Alice', 65.5], ['Joe', 66.8]] 循环。

while

上面的代码退出循环,

  1. 如果while (len < totalLen) { if ((*(structAddr + len) == CASE0)) // It is complaining here { arr[len] = *(structAddr+len); break; } arr[len] = *(structAddr + len + 1); arr[len + 1] = *(structAddr + len); len = len + 2; }
  2. 如果len < totalLen
  3. 你应该以只有一个停止条件的方式写它,或者在一个地方评估两个条件,比如

    structAddr[len] == CASE0

    我仍然不知道这是否正确,因为您的代码看起来很糟糕,并且在实际代码中不使用do { if ((*(structAddr + len) == CASE0)) { arr[len] = *(structAddr + len); // I don't know if it will naturally stop here // but certainly, the algorithm is too dark to see // that's why this is discouraged. } else { arr[len] = *(structAddr + len + 1); } arr[len + 1] = *(structAddr + len); len = len + 2; } while (len < totalLen); 之类的内容,而是使用*(structAddr + len)而不是更简单的解释和阅读。

答案 1 :(得分:0)

这种方法可能会解决您的问题,但不确定。

do {
    if ((*(structAddr + len) == CASE0))
        arr[len] = *(structAddr + len);
    else 
        arr[len] = *(structAddr + len + 1);

    arr[len + 1] = *(structAddr + len);
    len = len + 2;
} while (len < totalLen &&  !(*(structAddr + len) == CASE0));