为什么更改变量定义的顺序会改变代码的功能

时间:2017-07-05 17:26:31

标签: c dev-c++

有两个用Dev-c ++编写的代码,第一个是正常工作而另一个不是,为什么?

/* this code is working properly*/

#include<stdio.h>  
int main()
{  
    char op;    // this is the point 
    int a,b,c;  // where another code differs
    printf("Enter the two no.s:");
    scanf("%d %d",&a,&b);
    printf("Enter the operation(+/-/*//):");
    scanf("%s",&op);
    switch(op)
    { 
     case '+': c=a+b;
               printf("%d",c);
               break;

     case '-': c=a-b;
               printf("%d",c);
               break;  

     case '*': c=a*b;
               printf("%d",c);
               break;  

     case '/': c=a/b;
               printf("%d",c);
               break;  

     default: printf("Invalid Operation");
     }
}
/* this code is not working properly; only altered the declaration sequence of int and char*/

#include<stdio.h> 
int main()
{  
     int a,b,c;   
     char op;
     printf("Enter the a:");
     scanf("%d %d",&a,&b);
     printf("Enter the operation(+/-/*//):");
     scanf("%s",&op);
     switch(op)
     { 
     case '+' : c=a+b;
               printf("%d",c);
               break;

     case '-' : c=a-b;
               printf("%d",c);
               break;  

     case '*' : c=a*b;
               printf("%d",c);
               break;  

     case '/' : c=a/b;
               printf("%d",c);
               break;  

     default: printf("Invalid Operation");
     }
}

1 个答案:

答案 0 :(得分:4)

这是你的问题:

scanf("%s",&op);

%s格式说明符需要一个指向的指针,该指针可以存储字符串的数组的第一个字符。您传入的内容是单个字符的地址

因此,当您输入+之类的符号时,会将其写入op,但会在op之后的任何内存中写入空字节。完成字符串。通过写入你不应该写的内存,这会调用undefined behavior

对于未定义的行为,任何事情都可能发生。您的程序可能会崩溃,它可能会显示意外的结果,或者它似乎可能正常工作。此外,进行看似无关的更改,例如添加printf进行调试或(如您的情况)更改变量的顺序可能会改变未定义行为的显示方式。

要读取单个字符,您需要使用%c格式说明符。您还需要在格式字符串之前添加空格才能使用空格,即前一个scanf调用的换行符。这是必需的,因为%c本身不会跳过空格,这与其他格式说明符不同,例如%d%s

scanf(" %c",&op);