我用来检查下面代码的编码标准投诉的工具“只能从循环中退出”。它说下面的“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++;
}
}
答案 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
上面的代码退出循环,
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;
}
len < totalLen
你应该以只有一个停止条件的方式写它,或者在一个地方评估两个条件,比如
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));