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
*/