c++程序,定义了几个变量,如果把变量的初值赋值为0 ,程序就正确了,而不赋值就会出错?是为什么

colum初值赋值为0就正确,不赋值就不正确,,为什么?同样的row却不要赋初值:#include<iostream>//求4乘4矩阵对角线上的最大最小值usingnam... colum初值赋值为0就正确,不赋值就不正确,,为什么?
同样的row却不要赋初值:
#include<iostream>//求4乘4矩阵对角线上的最大最小值
using namespace std;
int main()
{
int a[4][4],b[4][4];
int max,min,i,j,row,colum=0; //colum初值赋值为0就正确,不赋值就不正确,,为什么?
cout<<"输入一个4阶方阵"<<endl;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
cin>>a[i][j];
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
b[i][j]=a[i][j];
}
}

system("CLS");
cout<<"这个4阶方阵是"<<endl;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
cout<<b[i][j]<<"\t";
}
cout<<endl;
}

max=a[0][0];
for(i=0;i<4;i++)
{
if(a[i][i]>max)
{
max=a[i][i];
row=i;
}
}
cout<<"这个矩阵的对角线上的最大值是"<<max<<"。它在第"<<row+1<<"行,第"<<row+1<<"列"<<endl;
min=b[0][0];
for(j=0;j<4;j++)
{
if(b[j][j]<min)
{
min=b[j][j];
colum=j;
}
}
cout<<"这个矩阵的对角线上的最小值是"<<min<<"。它在第"<<colum+1<<"行,第"<<colum+1<<"列"<<endl;
system("pause");
return 0;
}

另外的:如下这段程序中 x y 也不要赋初值,运行也正确!
求解释
#include<stdio.h>
int main()
{
int str[3][4]={43,44,34,3,24,5,45,66,76,8,2,232};
int i,j,x,y,max;
max=str[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(str[i][j]>max)
max=str[i][j];
x=i;
y=j;
printf("%d %d %d",max,x,y);
}
如果能有正确合理的解释,再追加50金币!!!
展开
 我来答
李晓倩落落
2012-11-11 · 超过13用户采纳过TA的回答
知道答主
回答量:24
采纳率:0%
帮助的人:34.5万
展开全部
因为你第一个程序的求最大值的函数如下:
max=a[0][0];
for(i=0;i<4;i++)
{
if(a[i][i]>max)
{
max=a[i][i];
row=i;
}
}
如果你的最大值就是a[0][0],那么就没有了row=i这句的赋值,所以输出
cout<<"这个矩阵的对角线上的最大值是"<<max<<"。它在第"<<row+1<<"行,第"<<row+1<<"列"<<endl;
这句就会出错,C对于没有赋初值的变量,一般是返回它的地址值,所以就与你想要的结果不同。
同理求min函数也是这样的。所以你必须将row,colum都要先赋0,这样你的max=a[0][0]或者min=b[0][0]是正确时就是返回的行列也是对了的。
至于第二个程序更容易理解了,就算max=str[0][0];这句是对了的,但你还有 x=i;y=j;这句赋值语句,所以返回的行列不会存在没有值班的情况~
明白了吧?
wanglixin1001
2012-11-11 · TA获得超过4174个赞
知道大有可为答主
回答量:1758
采纳率:80%
帮助的人:880万
展开全部
事实上,您应该对row和column都初始化为0,因为:
max=a[0][0]; // 这句话假设最大值是第一行第一列的,这时的row应该设定为0
min=b[0][0]; // 这句话假设最小值是第一行第一列的,这时的column应该设定为0
您说您的程序是正确的(只设定column=0),而row没有设定为0,,那么您可以试一下下面这组数据:
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
程序结果row是随机值,因为没有设定为初值0的结果。
更多追问追答
追问
我想知道为什么,因为在for循环里面已经给column赋值的。个人觉得就不要在定义的变量的时候给初值了吧?
追答
您只注意到在for循环里面给column赋值了,但那时有条件的赋值(   if(b[j][j]<min)   ),
如果循环完了这个if判定的条件都没有成立过呢?那么column的赋值语句是不是就没有执行了呢?
所以要赋初值,即min=b[0][0];这句话所表达的意义:应该设定column=0。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
arongustc
科技发烧友

2012-11-11 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:5980万
展开全部
首先你本来就应该赋初始值,编译器和C++语言并不规定变量初始值是什么,如果你不赋值,它得值可能就是一个你不希望得值,结果当然就不课预知了

所谓的初值是指你必须确保在使用前给它赋值,而你第二种情况已经在使用前给它赋值了,所以没有问题
追问
还在不?,第一个,第二个都是一样的情况呀,都是将 i 的值赋给colum,以及赋给x(在for循环里面赋的),为什么会有不同的结果呢???
追答
如果存在不赋值就出错的情况,一定有某个情况在没有初始化前就使用了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
希望村村民
2012-11-11 · TA获得超过1589个赞
知道小有建树答主
回答量:1187
采纳率:100%
帮助的人:953万
展开全部
在定义普通的局部变量时如果没有初始化
编译器会将原来内存中的位状态当做变量的值
而这个值往往是未定义的,有可能是以前程序运行后的状态
这个值可能是任何值

如果定义为全局变量,编译器会自动初始化内存区域为0值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lunatic_man
2012-11-11 · 超过20用户采纳过TA的回答
知道答主
回答量:120
采纳率:0%
帮助的人:50.2万
展开全部
变量在使用前,最好是进行初始化,不然会可能是一个你不想要的随机值。

至于出现一个正确一个不正确,是因为,你的a[0][0]或者b[0][0],刚好是数组中的最大,或者最小值,for循环里的if都判断为假了,所以if里面的赋值也没有进行。
如果把if里的>,<换成>=或者<=,应该就不会出错了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式