变量的定义的问题.

来源:百度知道 编辑:UC知道 时间:2024/06/03 23:14:43
#include<iostream>
using namespace std;

int n,f[10][10],a[10][10];

int main(){

cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++)
cin>>a[i][j];

for(int i=n-1;i>=0;i--){
for(int j=0;j<=i;j++){
if(f[i+1][j+1]+a[i][j]>f[i+1][j]+a[i][j])
f[i][j]=f[i+1][j+1]+a[i][j];
else
f[i][j]=f[i+1][j]+a[i][j];
}
}
cout<<f[0][0];
system("pause");
}



#include<iostream>
using namespace std;
int main(){

int n,f[10][10],a[10][10];

cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++)
cin>>a[i][j];

for(int i=n-1;i>=0;i--){
for(int j=0;j<=i;j++){
if(f[i+1][j+1]+a[i][j]>f[i+1][j]+a[i][j])

因为全局变量会自动初始化,而局部变量不会自动初始化。

将移到函数内部的
int n,f[10][10],a[10][10];

改为如下:

int n,f[10][10]={0},a[10][10]={0};

应该是一样的。程序上看是没有错误的。都一样。

你程序其他地方都有没有问题,程序错误在i重复定义了。。。注意看,你的程序有两行都写了 int i....,至于你说的全局变量与局部变量,全局变量在main()函数之前就已经调用了,局部变量在main()之后调用的。而且你的程序在这个地方没有语法错误,还有一点就是楼上说的,你的二维数组放在里面要初始化,其他不管怎么定义,一定要记住给他初始化!!!这是一个好习惯,因为编译器给你的初始化值有时候是未知而不可预料的,回答完毕。

二楼正解

全局变量和静态局部变量会自动初始化填充零。局部自动变量不会初始化。未经初始化的变量,它的值是随机的。
如二楼所说,改为int n,f[10][10]={0},a[10][10]={0};就可以了。注意虽然初始化列表只有一个元素,但一般情况下编译器会对数组之后的元素自动填充零。
另外的两个处理方法:
局部变量声明改为static int n,f[10][10],a[10][10];,行为同全局变量(因为这里main只会被调用一次,且声明的静态变量没有在main函数体外被引用);
#include<cstring>,利用std::memset函数显式覆盖变量的值:memset(f,0,sizeof(f));memset(a,0,sizeof(a));,看起来保险,不过效率比较低。
当然,一般用全局变量就行了,比较方便。
顺便说说LSS的问题。ISO C++循环中定义的变量作用域仅限于循环体内,所以int i在这里不会出现变量重复定义的错误,除非是在VC6那样对标准支持不佳的编译环境中。
----
[原创回答团]