问题:编译成功但结果错误

问题描述

我在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。

也。在orderint mv = (a1,b1);中:您声明了a1b1,但从未明确为其赋值。如果检查调用a1时的b1maxvalue是什么,您会发现它们将包含0,因为在C中,全局int将声明时自动为零。 (对于局部声明的变量,情况并非如此,在这种情况下,变量将被填充为无意义的位,直到初始化为止。由于a1b1不是您所期望的,因此mv不会符合您的期望,这很可能会破坏order其余部分中设计的逻辑。在使用之前,请务必确保已初始化局部变量或为其指定了值。

如果修改了maxvalue以选择输入的前两个数字中的最大值:选择i应该为哪个的逻辑可能会失败。因为mv始终是a or b之一,并且因为a - mv ==0b - mv之一始终为true,所以c永远不会分配给{{1 }},即使它是最高的,也不会先打印。

总之,

  • 使用局部变量,
  • 在使用任何变量之前将其初始化。
  • 确定可以重新评估i的逻辑 order将始终返回您期望的任何给定结果 输入。