我正在使用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循环的第一个子句中没有主表达式
答案 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
将被解析为声明i
和sum
的一个声明。所以在你的循环中你增加内部 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次迭代循环而没有任何输出,最后你得到你的结果 - 零。