【问题标题】:c++ simple sum in for loopc ++ for循环中的简单求和
【发布时间】:2011-08-08 22:24:59
【问题描述】:

我正在使用 g++ (GCC) 4.6.0,但无法生成正确的结果。在 c++ 中给出以下简单的 for 循环

  void sum(){
  int sum;
  for(int i=0,sum=0;i<=10;sum+=i,++i);
  cout << sum << endl;
  }

输出给我 0。假设在我添加的 for 循环中

  cout << sum << endl;

它给了我 0,1,3... 直到最后一行 0;

我认为我得到 0 的原因是因为 for 循环中的变量阴影?所以我尝试了 ::sum 如 ::sum=0 和 ::sum +=i。但它被编译器抱怨。我也试过了

  for(sum=0,int i=0;i<=10;sum+=i,++i); 

编译器还抱怨 for 循环的第一个子句中没有主表达式

【问题讨论】:

  • 请提供您实际期望的结果。
  • @Martin:为什么要在评论中回答?在一个答案中回答......除了几个人已经这样做了。
  • 这里的while循环会更甜:ideone.com/gdm6O:p

标签: c++ gcc loops for-loop


【解决方案1】:

真的,您在三种不同的事情上使用标识符sum 三次? :-S

把它写得可读:

int sum = 0;
for(int i = 0; i <= 10; ++i) { sum += i; }

不再有混乱,不再有阴影,不再有未初始化的变量。你想骗谁?想想你的替代者必须学习和理解你的代码!

提示:打开编译器警告!

PS:在任何人谈论效率并开始计算 CPU 周期之前:a) 不要。 b) 拥抱你的妻子。 c) 比较这段代码和你的代码的汇编。

【讨论】:

    【解决方案2】:

    int i=0,sum=0 int i=0; sum=0; 相同。这是一个声明两个变量的语句。

    这意味着你正在遮蔽外部sum

    void sum() {
      int sum; // <-- one `sum`
      for (int i=0,sum=0;i<=10;sum+=i,++i) {} // <-- second `sum`
      cout << sum << endl;
    }
    

    只有这样的声明语句才能出现在for 序言的第一个子句中(想想sum=0,int i=0 在代码的其他地方是否有效),但您可以通过pulling out the "initialisation" to 0 entirely 解决此问题:

    void sum() {
       int sum = 0;
       for (int i = 0; i <= 10; sum += i, ++i) {}
       cout << sum << endl;
    }
    

    或者,so that it's actually legible

    void sum() {
       int sum = 0;
       for (int i = 0; i <= 10; i++) {
          sum += i;
       }
       cout << sum << endl;
    }
    

    【讨论】:

    • @dalle:如果你点击链接,你会发现我没有。
    • @dalle:在逗号运算符上,[2003: 5.18/1] 表示:“[..] 左侧表达式 [..] 的所有副作用 (1.9) 都在之前执行正确表达的评估。” (强调我的)
    • 但是现在您已经编辑了答案。你一开始有sum += ++i,这和sum += i, ++i不一样。
    • @dalle:好的。那一定是最早的修订之一,而我正在查找该条款;很久没有了!
    • 是的,没错,可能是最早的修订版之一。无论如何,当你改变它时 +1。
    【解决方案3】:

    将您的代码更改为:

     void sum(){
      int sum = 0;
      for(int i=0;i<=10;sum+=i,++i); // all work is in for loop
      cout << sum << endl;
     }
    

    一些(较旧的)编译器不允许您使用原始代码,因为您在 for 循环中定义了第二个 sum,它隐藏了原始代码。因此,它在 for 循环 中正确累积,但在 for 循环外定义的 sum 保持不变。更多细节:

    int i = 0, sum = 0;
    

    等同于:

    int i = 0;
    int sum = 0;
    

    【讨论】:

    • 我知道我可以在 for 循环之外做 sum=0 。但我想利用 for 循环的初始阶段。
    • @cplusnewbieeeee:为什么?这样做并没有效率,将 sum 的可见性限制在 for 循环内部,并使代码的可读性降低(正如 Kerrek SB 正确指出的那样)。更少的代码行!= 更好的代码。
    • 请注意,gcc 的行为实际上是符合标准的。
    • @pmr:是的,我正在考虑我使用过的旧编译器在技术上不兼容。在这种情况下,该错误将是一个“功能”。
    • @Ben 我从不怀疑你知道这一点。恕我直言,您在答案中使用的措辞听起来好像是相反的。
    【解决方案4】:

    您有两个不同的sum 变量。一个在

    中声明
    int sum;
    

    行,以及在 for 循环的初始化声明中声明的另一行。

    for 语句的第一部分是或者单个声明表达式。在后一种情况下,表达式可以由逗号运算符分隔的多个赋值组成,但您不能在一个 for 循环中混合和匹配声明和表达式。因此,int i=0, sum=0 将被解析为声明isum一个声明。所以在你的循环中你增加了 inner sum,但是在循环之后只有 outer 是可见的,并且它仍然具有它开始时的垃圾值。

    (另外,您将循环的内容放在更新表达式而不是正文中,这让您感到羞耻!)

    【讨论】:

      【解决方案5】:

      你是对的。解决方案是这样做:

      void sum(){
          int sum = 0;
          for(int i=0;i<=10;sum+=i,++i);
          cout << sum << endl;
      }
      

      【讨论】:

        【解决方案6】:

        你为什么把;放在for循环后面?因此,您有 10 次循环迭代,没有任何输出,最后您得到结果 - 零。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-15
          • 2017-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-06
          • 1970-01-01
          • 2011-08-07
          相关资源
          最近更新 更多