【问题标题】:for(++i;++i;++i) the second argument is < or <=?for(++i;++i;++i) 第二个参数是 < 或 <=?
【发布时间】:2014-01-20 09:42:06
【问题描述】:

在这个for循环语句中

#include<stdio.h>

int main()
{
  static int i; 
  for(++i;++i;++i) { 
    printf("%d ",i); 

    if(i==4) 
       break; 
 } 
 return 0; 

}

变量i最初为0。第一轮for循环中的参数是
1st ++i: i = 0 + 1 = 1
2nd ++我: i=1+1=2
所以,在第一个循环中,我有这个 for(i=1; i&lt;2; ++i);for(i=1; i&lt;=2; ++i);

编辑 我在测试中在线找到了这个例子关于 C。我运行它(在 for-loop 内,我有一个断点,所以在一些循环之后它会中断)但我只是在猜测它的行为,所以我在这里问它以确定。我现在正在学习 C,所以对我来说存在愚蠢的问题。问比不问好。

【问题讨论】:

  • 您的代码中既没有&lt; 也没有&lt;=,那么您为什么希望它的行为与这两者一样呢?
  • @nhahtdh:在某些时候,i 会溢出,++i 会变成0,循环会中断
  • 为什么要用这种可怕的代码折磨自己?
  • 你为什么不运行它并用你的发现启发我们?
  • 你什么都没有:你拥有的是(隐含的)++i != 0。由于您的 i 正在递增,因此当它递增超过 INT_MAX 时会遇到未定义的行为。

标签: c for-loop


【解决方案1】:

在第二个参数中它实际上是++i!=0,循环被解释为

for(++i;++i!=0;++i)

如果您以肯定的i0 开头,这将是一个无限循环,当i 到达INT_MAX 时将调用未定义的行为。

如果 i 最初是 -Ve,则循环可能会在定义的运行处停止。

编辑:当您更改问题时,您的代码不会崩溃,但您可以通过将第二个 ++i 替换为 ++i!=0 来清楚地理解试运行。

所以第一次迭代变成:

(i=1;2!=0;++i/*this will execute later*/)

第二次迭代变为:

i=3 //this is from the 1st iteration last part.
(/*initialization is done 1st time only*/;4!=0;++i/*again, this will execute after this iteration*/)

【讨论】:

    【解决方案2】:

    它将打印2 4

    在 for 循环之前,i 将是 0。它还没有被分配任何东西,并且static 变量保证在它们第一次使用之前被初始化为零。

    它将执行 for 循环中的第一个 ++i,因为该表达式在循环开始时被计算一次。 i 将是 1

    它将执行第二个 ++i,因为在每个循环之前都会对其进行评估,以查看它是否应该运行循环的迭代。 i 将是 2

    它将运行循环体。这将打印2

    if 条件不成立,因此break 也不成立。

    它将在 for 循环语句中执行第三个++i,因为它会在每次迭代之后对其进行评估。 i 将是 3

    它将再次执行第二个++i,因为它需要查看是否需要运行另一个循环。它将是非零的,因此它将运行另一个循环。 i 将是 4。

    它将打印4

    if 条件为真,break 将退出循环。

    但是,这是一种无稽之谈。这是一种更合适的方式:

    int i;
    for (i = 2; i <= 4; i += 2)
        printf("%d ", i);
    

    或者更好:

    printf("2 4 ");
    

    【讨论】:

    • 我知道这是非常愚蠢的做法。我刚刚在一个关于 C 的在线测试中找到了这个例子,我对此很好奇。
    • 希望我的演练可以帮助您了解for 声明中的这三件事。
    【解决方案3】:
       static int i; 
    

    虽然 C 标准保证具有静态存储持续时间的变量初始化为 0,但您不应滥用它。始终初始化变量,无论是在声明它们的行还是在运行时。所以把这个改成static int i=0;

    第一个 ++i 确实相当于在那里有i=1。基本上你的循环是这样做的:

    for(i=1; loop_until_program_crash; i++)
    

    如果循环内有break,则循环可能写得不好。如果您提前知道循环应该何时结束,那么该条件应该在 for 循环条件内。如果您事先不知道,请改用while 循环。

    【讨论】:

      【解决方案4】:

      应该是:

      for(i=1; i<=2; ++i);
      static int i=0;
      for(++i;++i<=2;++i)
      {
            printf("4rth :%d\n",i);
      }
      

      见:http://ideone.com/TGLYlL

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-27
        • 2021-06-09
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        • 2011-05-14
        相关资源
        最近更新 更多