C开关语句,变量错误(用于计算器程序源代码)

C开关语句,变量错误(用于计算器程序源代码),c,variables,initialization,switch-statement,C,Variables,Initialization,Switch Statement,您好,今天当我尝试一些新的东西(突然在我脑海中浮现的概念和风格)时,我遇到了一些问题,我不明白为什么会发生 代码 //此程序将从用户处获取两个数字,并请求算术运算符,然后执行算术运算。 #包括 内部主(空) { 内特fNum; int sNum; int状态=1; int算子; INTANS; printf(“输入第一个操作数:”); 而(scanf(“%d”,&fNum)==0) ; printf(“请输入第二个操作数:”); 而(scanf(“%d”,&sNum)==0) ; pri

您好,今天当我尝试一些新的东西(突然在我脑海中浮现的概念和风格)时,我遇到了一些问题,我不明白为什么会发生

代码

//此程序将从用户处获取两个数字,并请求算术运算符,然后执行算术运算。
#包括
内部主(空)
{
内特fNum;
int sNum;
int状态=1;
int算子;
INTANS;
printf(“输入第一个操作数:”);
而(scanf(“%d”,&fNum)==0)
;
printf(“请输入第二个操作数:”);
而(scanf(“%d”,&sNum)==0)
;    
printf(“要使用的运算符\n”);
printf(“1代表+\n2代表-\n”);
while(状态)
{
scanf(“%d”、&运算符);
状态=0;
开关(操作员)
{
案例1:
ans=fNum+sNum;
打破
案例2:
ans=fNum-sNum;
打破
违约:
状态=1;
}
}
printf(“答案是%d\n”,ans);
返回0;
}
我的分析和问题

第一部分:

1.)有一件事我不明白,当我试图运行这段代码时,我从编译器收到一条警告消息,“C:\Users\Znet\Documents\Pelles C Projects\Test1\Test.C(10):警告#2229:Local'ans'可能在未初始化的情况下被使用”,但当然我仍然可以运行该程序,因为它不是错误消息

2.)出于好奇,我只是想知道为什么会出现此警告消息,而不是仅仅声明变量
ans
,而是使用整数值(0或任何整数)初始化它,警告信息刚刚消失。是什么导致了这种情况?是因为变量
ans
用于
switch
语句中,这就是为什么我们应该在使用它之前为它赋值的原因吗?因为(当我编写其他程序时)在使用变量存储算术表达式计算的值之前,我甚至不使用值初始化变量

第二部分:

1.)当程序要求用户为算术符号输入数字
1
2
时,问题在
switch
语句中出现

2.)如果我输入的整数不在1和2之间,程序将不会继续,而是等待我重新输入正确的值,这是我的主要意图

3.)但问题是,如果我输入的值不是整数而是字符,程序就会冻结,光标仍在闪烁,但它不会响应我的键盘输入。最后,我必须关闭程序才能关闭它

4.)我知道有很多方法可以编写这种程序,但我只是想知道为什么在这段代码中会出现这种情况



感谢阅读我的问题,希望能从你们那里得到解释和知识:)

    • 问:“警告#2229:本地‘ans’可能在未初始化的情况下使用。”

    • 答:这意味着ans在声明时可以包含任何值(因为堆栈变量在声明时不会被置零)——并且因为编译器没有看到保证在打印时设置变量的编程逻辑——它抛出此警告。做
      intans=0将删除它

    • 问:如果我输入的值不是整数而是一个字符,程序就会冻结,光标仍在闪烁,但它不会响应我的键盘输入。最后,我必须关闭程序才能关闭它

    • A

  • scanf
    返回匹配的数量——如果不匹配整数,则返回0。因此,;检查返回值。

    第一个问题:

    编译器检测到,
    ans
    只获得有条件地分配给它的值(对于switch语句中的两种特定情况)。一些编译器对此发出警告,而其他编译器则没有。通常,初始化您创建的任何变量都是很好的做法

    第二个问题:

    这个问题以前已经回答过很多次了-请参阅。问题是scanf在这种情况下只接受整数。如本链接所述,“任何与格式字符串不匹配的字符都会导致它停止扫描,并将无效字符保留在缓冲区中。”这会导致while循环永远不会退出。如果您对更多细节感兴趣,这里提到的链接应该会对您有所帮助。

    第一部分 当您使用变量而未显式初始化变量时,编译器会发出警告。这是因为未初始化的变量会在代码中产生严重的错误。例如,考虑下面的代码段。

    int main()
    {
       /* NOTE: 'f' is uninitialized */
       int f, n;
    
       printf ("\nn : ");
       scanf ("%d", &n);
    
       while (n)
        f = f * n--;
    
       printf ("\nfactorial = %d", f);
       return 0;
    }
    
    在上面的代码中,程序的输出是未定义的
    f
    是一个局部变量(
    automatic
    ),因此当
    main
    开始执行时
    f
    可以有任何值,即垃圾,阶乘计算依赖于
    f
    的初始值。所以在这种情况下,未初始化的变量将导致灾难。要解决这个问题,你需要做
    intf=1并获得正确的输出。这不是一个错误,但可能是一个逻辑错误,因此编译器会帮助您解决这个问题,这样您就不会意外地使变量未初始化。在您的情况下,它不需要初始化,因此您只需执行
    ans=0停止警告

    第二部分 字符和整数的解释不同。例如,
    12
    是两个字符,我们也可以说它是一个整数。要将其作为整数输入,应使用
    %d”
    和字符
    scanf(“%c%c”,&var1,var2)因为有两个字符。当您在格式字符串为
    “%d”
    时输入字符时,它将检测到输入不是整数
    do { 
        printf("Which operator you wanted to use\n");
        printf("1 for +\n2 for -\n");
    } while ( scanf("%d", &operator) != 1 );
    
    int main()
    {
       /* NOTE: 'f' is uninitialized */
       int f, n;
    
       printf ("\nn : ");
       scanf ("%d", &n);
    
       while (n)
        f = f * n--;
    
       printf ("\nfactorial = %d", f);
       return 0;
    }
    
    /* Ask for input while the user does not input a 
     * valid integer.
     */
    while (scanf ("%d", &operator) != 1)
    {
       /* Body is entered whenever an invalid integer is entered */
       /* Your message */
    }
    /* When the user inputs a valid integer the condition 
     * in 'while' loop is false and program continues 
     */