【问题标题】:What's wrong with this C program [duplicate]这个C程序有什么问题[重复]
【发布时间】:2010-08-11 18:28:26
【问题描述】:

可能重复:
Help with C puzzle

该程序的目的是打印 20 次减号,但它不起作用。

  #include <stdio.h>
  int main()
  {
      int i;
      int n = 20;
      for( i = 0; i < n; i-- )
          printf("-");
      return 0;
  }

【问题讨论】:

  • 它给出了无限的减号...
  • @SurajRk 它实际上不会给出无限的。当 i = -2^31 尝试减少时,它最终会变成正数
  • 只有 unsigned 算术被定义为由标准包装; signed 溢出是未定义的行为。因此允许编译器在这里发出一个真正的无限循环。例如,比较 gcc 4.4 与 -S -O2-S -O2 -fwrapv 对这个程序所做的事情。
  • @Zack +1 不知道 - 很高兴知道
  • @Zack:实际上,大多数通用计算机系统都会环绕。你不能指望它。根据标准,无限循环是完全可以的,任何其他行为也是如此。

标签: c for-loop


【解决方案1】:

这是一个经典的谜题!

我是这么看的

“您只能更改/插入/删除代码中的一个字符以使 - 打印 20 次”。

有些答案是(如果我没记错的话)

1)

 #include <stdio.h> 
  int main() 
  { 
      int i; 
      int n = 20; 
      for( i = 0; -i < n; i-- ) 
          printf("-"); 
      return 0; 
  }

在这里您将i &lt; n 更改为-i &lt; n

2)

 #include <stdio.h> 
  int main() 
  { 
      int i; 
      int n = 20; 
      for( i = 0; i < n; n-- ) 
          printf("-"); 
      return 0; 
  }

在这里你把i--改成n--

3)

 #include <stdio.h> 
  int main() 
  { 
      int i; 
      int n = 20; 
      for( i = 0; i + n; i-- ) 
          printf("-"); 
      return 0; 
  }

您将i &lt; n 更改为i+n

对于挑战,请尝试更改/插入/删除一个字符以使其打印 - 21 次。 (如果您想尝试,请不要阅读此答案的 cmets!)

【讨论】:

  • +1 表示这是一个谜题。深思熟虑的答案。
  • 挑战很有趣 ;) 很高兴我在尝试回答之前没有看 cmets。
【解决方案2】:
 #include <stdio.h>
  int main()
  {
      int i;
      int n = 20;
      for( i = 0; i < n; i++ )
          printf("-");
      return 0;
  }

你有--而不是++

【讨论】:

  • 是的,该循环将永远运行,因为i0 开始并不断变小。它永远不会大于 n,因此永远不会达到循环的退出条件。
  • 整数回绕时肯定会大于n吗?循环运行的时间会比预期的长一点。
【解决方案3】:

将 i-- 替换为 i++。

【讨论】:

    【解决方案4】:
    int main() { 
      int i; 
      int n = 20; 
      for( i = 0; i < n; i++)
        printf("-"); 
      return 0; 
    }
    

    你有递减而不是递增。

    【讨论】:

      【解决方案5】:

      你有没有试过改变

      i--
      

      i++
      

      只要“i”小于 20,您就有循环打印出“-”。 每次循环后将 i 的值减 1,它将继续打印 很长一段时间。将 for 循环的最后部分更改为“i++”意味着它将在每个循环中执行一次迭代,并在第二十次迭代完成后停止。

      【讨论】:

        【解决方案6】:

        将 i-- 更改为 i++。 i-- 递减开始时为 0 的值,随后递减不会达到 20(或 +20)。

        【讨论】:

          【解决方案7】:

          i-- 必须是 i++

          你也可以

           int n = -20;
            for( i = 0; i > n; i-- )
          

          但这是不好的编码习惯

          【讨论】:

          • 为什么建议一个不好的编码习惯的答案?
          • 因为在其他情况下您确实希望减少计数器。在这种情况下,递减计数器没有意义。
          • @Jamie Creativity ;) 人们甚至可以从不应该以特定方式完成的事情中学习。
          • 创造力有它的位置 - 向显然是 c 初学者的人建议一个行动方案不是其中之一。另外,我同意递减计数器有时更有用 - 所以建议 when 它更有用。同样,这里不是这种情况。
          【解决方案8】:

          你到底想解决这个问题? 在这里,您尝试减少变量的值..一个变量的值永远不会达到您提供的条件(i

          #include <stdio.h>
          int main()
          {
              int i;
              int n = 20;
              for( i = 0; i < n; i-- )
                  printf("-");
              return 0;
          }
          

          根据您提出的问题,i 应该递增,即i++ 而不是i--

          @jamie wong:thanx man..learnt a new thing about tht a wraparound....

          【讨论】:

            【解决方案9】:

            您不会打印破折号。您可以选择 Jaime Wong 的解决方案,也可以这样做:

            for (i = n; i &gt;= 0; i--)

            【讨论】:

            • 你会打印很多破折号。而且,这是一种可怕的方法。非常不规范,而且毫无意义地略显晦涩。
            • 这不会像其他人解释的那样打印破折号。另外,你把我的名字拼错了。
            • 哎呀,你是对的。很抱歉,在这两个方面。
            猜你喜欢
            • 2021-02-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-08
            相关资源
            最近更新 更多