【问题标题】:C: For Loop: Why does a loop-continuation condition of "z" work the same as "z > 0"with a decrement of z--?C: For 循环:为什么“z”的循环继续条件与“z > 0”相同,但减少了 z--?
【发布时间】:2022-01-25 05:30:30
【问题描述】:

完全披露:我想我已经通过形式化所有这些来回答我自己的问题。请问你能检查我的逻辑吗?

使用以下术语: for (初始化控制变量;循环继续条件[布尔表达式];de/increment)

我写了一个循环,打印出一个马里奥风格的金字塔:

    Welcome to Super Mega Mario! 
    Height: 5
        #  #
       ##  ##
      ###  ###
     ####  ####
    #####  #####

在代码中,我使用了两种不同的循环继续条件:

for (int z = i + 1; z > 0 ; z--)
for (int z = i + 1; z ; z--)

我不确定为什么第二个例子有效,下面是我的解释。

为什么我认为这两种方法都有效:

第一个例子(z > 0):

要打印最后一行##### #####,for 函数会打印“#”5 次。首先,因为z == 5,所以Bool为真,所以打印“#”。那么 z == 4,Bool 为真,所以打印“#”。这继续 直到 z == 0,所以 Bool 为 FALSE,因此中断。

第二个例子(z):

所有非零值都为真,z 为 5,4,3,2,1。当 z 为 0 (FALSE) 时,中断。

我正在学习,我想开发优秀的风格和设计,如果你能解释哪个例子设计得更好,请告诉我!另外,如果你可以推荐我的风格的编辑,那么也请 HMU。 【源码@end】。

    int main(void)
    {
        int n;//Declare variables outside of loops to allow "while" function to use it.
        printf("Welcome to Super Mega Mario! \n");
        do
        {
            n = get_int("Height: "); //prompt user for height of pyramid.
        }
        while (n < 1 || n > 8);
        for (int i = 0; i < n; i++)//How many rows will be created
        {
            for (int j = 0; j < n; j++) //column
            {
                for (int x = n - i - 1; x; x--) //for(initialise control variable; loop continuation condition [boolean expression]; increment)
                {
                    printf(" ");
                }
                for (int y = i + 1; y; y--) //If the loop continuation condition is y, then it's TRUE. So the function will run. Then it decreases this value by 1, so it's now 0 or FALSE so the function breaks.
                {
                    printf("#");
                }
                printf("  ");
                for (int z = i + 1; z > 0 ; z--) //In theory "z>0" works the same as z on its own.
                {
                    printf("#");
                }
                break;
            }
            printf("\n");
        }
    }

【问题讨论】:

  • 在一个条件下,if (z)if (z != 0) 相同。也适用于 for 循环条件。

标签: c loops for-loop


【解决方案1】:

表达式中的z 等价于z != 0。当放置在表达式中时,所有非零值(正或负)都将被视为布尔值。同样,给定一个指针int* p;,那么if(p) 等价于if(p != NULL)


如果你能解释哪个例子设计得更好,请告诉我!

  • 样式是主观的,尽管通常认为明确的样式更好,因为这样可以提供自我记录的代码并排除拼写错误。如果我输入if(p != NULL),那么就不会误解我的代码要做什么。但是,如果我输入 if(p),这可能是我的意思,或者当我实际上打算取消引用指针 if(*p) 时,它可能是一个错误。

  • 关于风格主题,通常最好让for 循环尽可能简单。这意味着在 3 个for 子句中避免不必要的复杂表达式,并尽可能进行向上计数循环。 for 循环的惯用形式是:

    for(int i=0; i<n; i++)
    

    我们应该努力尽可能接近这一点。例如,在 for (int z = i + 1; z &gt; 0 ; z--) 的情况下,您迭代的顺序无关紧要,因此向下计数只是混淆。没有理由不写成for(int z=0; z&lt;i; z++)

  • Also 样式:无论您使用哪种大括号放置样式,惯例始终将do while 中的while} 写在同一行。即:} while (n &lt; 1 || n &gt; 8);

  • 此处的错误:break; 阻止 for (int j = 0; j &lt; n; j++) 循环运行多次。

【讨论】:

  • 太棒了,你回答得这么清楚。在做了更多的问题之后,我回到了这个,你所说的真的很深入。感谢Lundin的帮助!像你这样的人真的让我很开心:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多