Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 改进此代码可读性的建议_C_Code Readability - Fatal编程技术网

C 改进此代码可读性的建议

C 改进此代码可读性的建议,c,code-readability,C,Code Readability,我不确定我是否应该在这里问这个问题,或者问其他StackExchange网站,但我会继续。。。如果此处不适合,请迁移) 我正在检查一个代码。要求调用函数n的次数,参数范围为0到n。但是如果n大于7,则只调用该函数7次 我的同事按如下方式实施: void ExecuteFunctions(U8 count) { if(count > 0) oprA(0); if(count > 1) oprA(1); if(count > 2) oprA(2);

我不确定我是否应该在这里问这个问题,或者问其他StackExchange网站,但我会继续。。。如果此处不适合,请迁移)

我正在检查一个代码。要求调用函数
n
的次数,参数范围为0到
n
。但是如果
n
大于7,则只调用该函数7次

我的同事按如下方式实施:

void ExecuteFunctions(U8 count)
{
    if(count > 0) oprA(0);
    if(count > 1) oprA(1);
    if(count > 2) oprA(2);
    if(count > 3) oprA(3);
    if(count > 4) oprA(4);
    if(count > 5) oprA(5);
    if(count > 6) oprA(6);
    if(count > 7) oprA(7);
}
我将其修改为:

void ExecuteFunctions(U8 count)
{
    for(U8 loopcnt = 0; loopcnt < count; loopcnt++)
    {
        oprA(loopcnt);

        if(loopcnt == 7)
        {
            // We don't want to execute this function more number of times if it is already executed 7 times
            break;
        }
    }
}
void ExecuteFunctions(U8计数)
{
对于(U8 loopcnt=0;loopcnt
但我仍然觉得有更好的方法,需要你们的投入。
(如果不在这里,也请迁移)

MIN是一个有用且经常定义的宏

#define MIN(a,b)     (((a) > (b)) ? (b) : (a))
#define MAX_STEP 7

void ExecuteFunctions(U8 count)
{
    int loopcnt = 0;
    count = MIN(count, MAX_STEP);

    while(loopcnt++ < count) {
        oprA(loopcnt);   
    }
}
定义最小值(a,b)((a)>(b))?(b):(a)) #定义步骤7中的最大值 无效执行函数(U8计数) { int loopcnt=0; 计数=最小值(计数,最大步数); while(loopcnt++
MIN是一个有用且经常定义的宏

#define MIN(a,b)     (((a) > (b)) ? (b) : (a))
#define MAX_STEP 7

void ExecuteFunctions(U8 count)
{
    int loopcnt = 0;
    count = MIN(count, MAX_STEP);

    while(loopcnt++ < count) {
        oprA(loopcnt);   
    }
}
定义最小值(a,b)((a)>(b))?(b):(a)) #定义步骤7中的最大值 无效执行函数(U8计数) { int loopcnt=0; 计数=最小值(计数,最大步数); while(loopcnt++让编译器对其进行优化。我觉得以下内容更具可读性:

void ExecuteFunctions(U8 count)
{
    for(U8 loopcnt = 0; loopcnt < count && loopcnt < 8; loopcnt++)
    {
        oprA(loopcnt);
    }
}
void ExecuteFunctions(U8计数)
{
对于(U8 loopcnt=0;loopcnt

当然,您需要运行分析器来实际评估程序的性能。

让编译器对其进行优化。我觉得以下内容更具可读性:

void ExecuteFunctions(U8 count)
{
    for(U8 loopcnt = 0; loopcnt < count && loopcnt < 8; loopcnt++)
    {
        oprA(loopcnt);
    }
}
void ExecuteFunctions(U8计数)
{
对于(U8 loopcnt=0;loopcnt
当然,您需要运行一个分析器来实际评估程序的性能。

我会将其写成

void ExecuteFunctions(unsigned count) {
    // Could use min() too if available.
    unsigned iters = count < 7 ? count : 7;

    for (unsigned i = 0; i < iters; ++i)
        oprA(i);
}
我会把它写成

void ExecuteFunctions(unsigned count) {
    // Could use min() too if available.
    unsigned iters = count < 7 ? count : 7;

    for (unsigned i = 0; i < iters; ++i)
        oprA(i);
}
void ExecuteFunctions(U8计数)
{
对于(U8 loopcnt=0;loopcnt<(计数&7);loopcnt++)
{
oprA(loopcnt);
}
}
无效执行函数(U8计数)
{
对于(U8 loopcnt=0;loopcnt<(计数&7);loopcnt++)
{
oprA(loopcnt);
}
}
如果您真的喜欢
switch
语句,请尝试此操作,看看它是否能通过代码检查:

void ExecuteFunctions(U8 count) {
    int i = 0;
    switch (count) {
      default: oprA(i++);
      case 6:  oprA(i++);
      case 5:  oprA(i++);
      case 4:  oprA(i++);
      case 3:  oprA(i++);
      case 2:  oprA(i++);
      case 1:  oprA(i++);
      case 0:  oprA(i);
    }
}
如果您真的喜欢
switch
语句,请尝试此操作,看看它是否能通过代码审查:

void ExecuteFunctions(U8 count) {
    int i = 0;
    switch (count) {
      default: oprA(i++);
      case 6:  oprA(i++);
      case 5:  oprA(i++);
      case 4:  oprA(i++);
      case 3:  oprA(i++);
      case 2:  oprA(i++);
      case 1:  oprA(i++);
      case 0:  oprA(i);
    }
}


让编译器优化它。它可能会为您展开循环。@AustinMullins这主意不错,但优化功能已关闭。你可以说,它现在对我来说就像一个编程之谜!可读性或性能优化?您可以将
loopcnt<8
条件移动到循环条件。它不会优化它,但会使它更紧凑。问题不清楚:
0
7
已经是
8次了。
n
是否包含在范围内?您和同事的代码似乎都没有实现规范。让编译器对其进行优化。它可能会为您展开循环。@AustinMullins这主意不错,但优化功能已关闭。你可以说,它现在对我来说就像一个编程之谜!可读性或性能优化?您可以将
loopcnt<8
条件移动到循环条件。它不会优化它,但会使它更紧凑。问题不清楚:
0
7
已经是
8次了。
n
是否包含在范围内?您的代码和同事的代码似乎都没有实现规范。您还应该提到宏存在的缺陷。在这里也很有用。
while(loopcnt++
应更改为
for(loopcnt=0;loopcnt
否则
oprA()
将以递增的值调用。您还应提及宏的陷阱
MIN
。在这里也很有用。
while(loopcnt++
应更改为
for(loopcnt=0;loopcnt
否则
oprA()
将以递增的值调用。这将为
count==8调用它零次。可能是一些类似的技巧…这将为
count==8
调用零次。可能是一些类似的技巧…很好的
循环。注意:
swtich()
以相反的顺序调用
oprA()
。对,这就是为什么我说“如果顺序不重要”。为什么你这么做了-另一个快速阅读和代码比文档更响亮的例子。此代码为
计数<8
额外调用
oprA()
,但如果顺序和准确性都不重要的话……我想知道为什么没有人更早地发现这一点。我将切掉switch语句部分。对于循环,这是一个很好的
。注意:
swtich()
以相反的顺序调用
oprA()
。对,这就是为什么我说“如果顺序不重要”。为什么你这么做了-另一个快速阅读和代码比文档更响亮的例子。此代码为
计数<8
额外调用
oprA()
,但如果顺序和准确性都不重要的话……我想知道为什么没有人更早地发现这一点。我将删掉switch语句部分。这里没有偷东西的事。最好的答案最终会出现。不用在你的信里提到我,没有偷东西的事。最好的答案最终会出现。不用在你的信里提到我。