哪个循环更好?

时间:2017-09-02 05:43:09

标签: c

这是C的初学者;想问下面哪两个代码更适合打印1和给定数字之间的奇数整数?

// Precond: n > 0
void print_odd_integers(int n)  {
    int i;
    for (i=1; i<=n; i+=2)
        printf("%d ", i);
    printf("\n");
}

// Precond: n > 0
void print_odd_integers(int n)  {
    int i;
    for (i=1; i<=n; i++)
        if (i%2 != 0)
            printf("%d ", i);
    printf("\n");
}

如果两者都不能说明显“更好”,版本之间会有什么不同的权衡?

5 个答案:

答案 0 :(得分:3)

使用第一个循环如果n不是像INT_MAX这样的极端情况,也是i从奇数整数开始的情况,因为它已经跳过了一半数字迭代。

否则使用第二个循环,因为如果n = INT_MAX,第一个循环将变为无限循环。

答案 1 :(得分:2)

绝对是第一个。
原因:

- 减少代码行数

- 如果有其他处理方式的方法,则主要避免使用分支语句(如果,if if,switch case,...)。

- 两种算法的时间复杂度相同O(n)。所以这主要是代码更加美丽的问题。永远记住,更易读的代码更漂亮。

修改

  • 事实上,在边缘上第一个解决方案具有未定义的行为是显而易见的。但必须在算法部分之外检查这些输入验证。并且建议您不要将验证码与逻辑混合。您可以轻松地在该功能的第一位检查$result = mysql_query("SELECT id_item,id_transaction from transaction_item ")or die("<br/><br/>".mysql_error()); ,并iINT_MAX
  • 打印i==INT_MAX-1

答案 2 :(得分:0)

从功能上讲,它们是相同的,所以除非你真的需要最大的性能,否则它并不重要。

但是,跳过if语句的解决方案效率很高。你正在跳过一半的数字而不需要检查模数的条件。

答案 3 :(得分:0)

由于算术溢出,两个循环都有n == INT_MAX未定义的行为。

  • 第一个循环可能会为您提供更好的性能

  • 如果您稍后将代码更改为从任意值开始,则第二个循环可能更具可读性(对于初学者而言)并且不易出错。

    我会在for主体周围使用大括号,因为它不是简单的单行语句,而是围绕二元运算符的空格以提高可读性:

    void print_odd_integers(int n)  {
        int i;
        for (i = 1; i <= n; i++) {
            if (i % 2 != 0)
                printf("%d ", i);
        }
        printf("\n");
    }
    

另请注意,两个循环都会在换行符之前的最后一个数字后输出一个空格,这可能不正确。

您可以通过一次额外测试解决这两个问题:

void print_odd_integers(int n)  {
    for (int i = 1; i <= n; i += 2) {
        printf("%d", i);
        if (i == n)
           break;
    }
    printf("\n");
}

答案 4 :(得分:-3)

第二种解决方案是“专业”方式。

你可以改变的一件事是布局:

void print_odd_integers(int n)  
{
    int i;
    for (i=1; i<=n; i++)
    {
        if (i%2 != 0)
        {
            printf("%d\n", i);
         }
    }
    printf("End.\n");
    system("Pause"); //So you can see what you did :)
}

玩得开心:)!