问题描述
我在geany上用C编码的程序应该以降序显示3输入的int,编译成功,但是它只显示最后一个数字和两个零,我的老师告诉我们使用函数,所以...我不知道我的代码有什么问题 ps:很抱歉,我希望在修复之前先检查所有这些内容。
#include <stdio.h>
#include <stdlib.h>
int a1,b1;
int a,b,c;
int i,j,k;
int mv;
int maxvalue ( int a1,int b1){
if (a1 > b1){
return a1;
}
else {
return b1;
}
}
void order ( int a,int b,int c){
int mv = maxvalue( a1,b1);
if (a - mv == 0){
i = a;
}
else if ( b - mv == 0){
i= b;
}
else {
i = c ;
}
printf("%d\n",i);
if (( a < i) && ( a-mv ==0)) {
j=a;
}
else if (( b< i)&&( b - mv ==0 )) {
j = b;
}
else{
j = c;
}
printf("%d\n",j);
if (( a < j) && ( a - mv == 0)){
k=a;
}
else if (( b < j) &&( b - mv ==0 )) {
k = b;
}
else{
k = c;
}
printf("%d",k);
}
int main(int argc,char **argv)
{
a = a1;
b = b1;
scanf("%d%d%d",&a,&b,&c);
order(a,c);
return 0;
}
解决方法
该问题的注释中指出的一个问题是局部变量遮盖了同名的全局变量,因此您应该研究SCOPE的概念。按照建议,将变量设置为LOCAL。
也。在order
,int mv = (a1,b1);
中:您声明了a1
和b1
,但从未明确为其赋值。如果检查调用a1
时的b1
和maxvalue
是什么,您会发现它们将包含0,因为在C中,全局int
将声明时自动为零。 (对于局部声明的变量,情况并非如此,在这种情况下,变量将被填充为无意义的位,直到初始化为止。由于a1
和b1
不是您所期望的,因此mv
不会符合您的期望,这很可能会破坏order
其余部分中设计的逻辑。在使用之前,请务必确保已初始化局部变量或为其指定了值。
如果修改了maxvalue
以选择输入的前两个数字中的最大值:选择i
应该为哪个的逻辑可能会失败。因为mv
始终是a or b
之一,并且因为a - mv ==0
或b - mv
之一始终为true,所以c
永远不会分配给{{1 }},即使它是最高的,也不会先打印。
总之,
- 使用局部变量,
- 在使用任何变量之前将其初始化。
- 确定可以重新评估
i
的逻辑order
将始终返回您期望的任何给定结果 输入。