Q:
为什么输入了数字后cnt还是0 ?
#include<bits/stdc++.h> using namespace std; int arr[1001]={}; int main(){ int k=0,cnt=0; while(scanf("%d",&arr[k++])!=EOF){ cnt+=arr[k]; } k--; cout<<cnt*pow(2,k-1); return 0; }
A:
问题就出在这:
&arr[k++]
Are your getting it?
k始终指向未输入的位置
说人话就是:那个while循环里的k++,在你的cnt累加前已经被加一了。这就导致你的cnt累加永远访问的是输入后的下一个元素,所以累加的都是0,就输出了0。
S:
WAY 1
cnt+=arr[k-1];
WAY 2
&arr[++k]
One more thing
这下应该真的搞懂了 [k++]
与 [++k]
的区别了吧(づ ̄ 3 ̄)づ
关于EOF(end of file)你需要知道这些:
1.C中常见用法之一(如有,补!)
#include <stdio.h>
int main(){
int n;
while(scanf("%d",&n) != EOF){
}
return 0;
}
在这"scanf("%d",&n) != EOF
"相当于"scanf("%d",&n) != EOF
",或"~scanf("%d",&n)
",或"scanf("%d",&n) == 1
" 。
scanf的返回值由后面的参数决定
那有同学就要问了,手动输入时这个程序如何结束呢?
在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用Ctrl + z,再按 Enter 的方式来告诉系统已经EOF,这样系统才会结束while.
2.C++中一般用这个
while ((cin >> a) != 0)
cin是C++的输入流对象,">>"是重载的运算符,cin>>的返回值是cin对象。用这个当条件的话,通过检测其流的状态来判断结束; (1)若流是有效的,即流未遇到错误,那么检测成功; (2)若遇到文件结束符,或遇到一个无效的输入时(例如本题输入的值不是一个整数),istream对象的状态会变为无效,条件就为假;读取失败的时候,就不能继续读取了,那么读取操作结束,while(cin>>a)就返回false,跳出循环!
或者说,利用C++中的
while (cin>>n,n)
输入一个数,这数不为0时进入循环,为0时跳出循环。