关于if和else的一点心得及程序调试的方法
今天上C++的第一堂实验课,老师为了了解一下我们之前学的C语言怎么样,出了一到程序题,让我们编一下。题目很简单就是给定一元二次方程ax^2+bx+c=0的三个系数,然后给出结果,并能够循环执行,主函数只负责输入参数,要至少有一个函数,本人很快就理清思路开始编写,很快写完了,并且编译了,下面的就是我的第一遍源代码(VC编译环境):
1 | #include <stdio.h> |
但是在运行的时候,发现输入完a,b,c三个数据后,程序不停的出现 【是否还要继续运行程序,“是”请输入“1”,“否”请输入“0”】 这个提示信息,看来可能是while循环导致的不停的循环,先注释掉,然后再运行,输入完三个数后什么也没显示,程序就结束了。
我前前后后看了好几遍也没找到问题,第一次猜测是数据输入有些问题,于是在第16行之后加了一行printf输出一下a,b,c三个值,编译运行,成功输出,证明输入正确。于是又猜测可能是数据没有被带入到函数中去,于是又在28行后面插入输出语句进行测试(这里注意,一定要把printf放到后面,不能放到27或者28行前面,因为27,28行是声明的局部变量,局部变量的声明必须要放在这个函数的头部,这是老师说的)。测试结果正常,证明数据已经能进入函数。由于我输入测试的数据,应该进入68行的那个花括号,所以就在那附近检查,终于发现了问题,原来是一时打字疏忽,把62行的判断相等双等号打成了赋值单等号。这样一来,就成了把0赋值给d,而if(0)肯定不执行花括号里的内容,所以程序就跳过了所有的if,结果就是什么都不会显示。于是我想到了,如果当时使用了else的话,那么问题很快就能找到,因为一个判断不正确,他会跳转到else的花括号,这样就等于所以了检查范围。既然找到了问题,那么把之前注释掉的while循环改过来,然后把=加上,编译运行成功了。
附:由于机房使用的是VC,而我现在写这篇文章的时候是在我的本本的ubuntu系统下,于是又出现了点小插曲,就是sqar()函数在编译时,提示错误信息:
1 | /tmp/ccszYPUG.o: In function `charge': |
我在网上搜索了一下,找到了下面的这个资料,先收了,以备后用:
1 | -l参数和-L参数 |
最后还是找到了,需要加-lm参数,编译指令如下:
1 | gcc 1.c -o a -lm |