for循环中的c ++简单求和

时间:2011-08-08 22:24:59

标签: c++ gcc loops for-loop

我正在使用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循环的第一个子句中没有主表达式

6 个答案:

答案 0 :(得分:8)

真的,你使用标识符sum三次用于三种不同的事情吗? :-S

只要写得好:

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

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

提示:打开编译器警告!

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

答案 1 :(得分:6)

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是否在您的代码中的其他地方有效),但您可以通过{{解决此问题3}}:

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

或者,pulling out the "initialisation" to 0 entirely

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

答案 2 :(得分:4)

将您的代码更改为:

 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;

答案 3 :(得分:3)

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

中宣布
int sum;

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

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

(另外,对于你把循环的肉放在更新表达式中而不是在体内而感到羞耻!)

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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