目录
报错与解决方法的区别
常见错误:
编译型错误
可被编译器发现
不能被编译器发现
链接型错误
运行时错误
怎么找bug
断点介绍
有一句常说的话:一名程序员的工作时间,有三成在写代码,其余的七成都在调试。
也就是:我写bug——我找我写的bug——修bug——直到程序按照我们的想法运行,也就是我们写出来让在自己满意的程序。
报错是指在编程过程中出现的错误提示信息,标识了程序执行错误的原因和位置。而解决方法是指需要采取的行动来消除或修复报错的原因,以使程序正常运行。报错和解决方法之间的区别在于,报错是问题的体现,解决方法是解决问题的步骤或方案。报错是指出问题的地方,解决方法则是我们应该如何修复出问题的代码。因此,我们需要对报错信息进行正确的解读,并采取合适的解决方法来修复错误。
在写代码的过程中,我们在编译时会出现各种错误,有的编译器会报错,有的则不会;有的错误容易发现,有的则很难找出错误,在这里,我来分享一些常见的错误类型和实例:
也就是常见的语法错误(暂时这样认为),有一些会被编译器检测到,也就是违背语法规则,但有一些虽然不违背语法规则,能编译过去,但与我们想象的程序执行结果不同。
我们可以点击编译器下方的叉号来找到错误:
e.g.1
如图,点击叉号后,会出现整个错误列表:(以少写 ’ ; ‘ 为例)
由于VS编译器比较智能,
在错误列表中会有编译器的 说明,也就是错误信息;
在 行 的列表中也标出来了错误代码的行数。
此类错误,由于违背最基本的语法规则,借助编译器很容易被找到。
e.g.2
if (arr[i] > max);
{
max = arr[i];
}
在上面这段代码中,我们 ” 不小心 ” 多写了一个分号,编译器会正常地接受if判断语句后代码的分号,而不会提示任何警告信息,因此编译器对这段代码的处理与下面这段代码大不相同:
if (arr[i] > max)
{
max = arr[i];
}
在if()后多了一个分号,实际上相当于:
if(arr[i] > max)
{
;
}
max = arr[i];
e.g.3
if (n < 3)
return
max = arr[i];
max = arr[j];
max = arr[k];
在上面这段代码中,不是多写了一个 “ ; ” ,而是少些了一个 “ ; ”,同样也会招致麻烦:
此处return后面遗漏了一个分号,然而这段代码在编译时让能通过,但会将语句:
max = arr[i];
当作了return语句的操作数。上面这段代码实际上就相当于:
if (n < 3)
reyurn max = arr[i];
max = arr[j];
max = arr[k];
如果这段代码所在的函数声明其返回值为void,编译器会因为实际返回值的类型与声明返回值不一致而报错。
然而,如果一个函数不需要返回值,我们通常在函数声明时省略返回值类型,这时编译器会默认将这个函数的返回值视作int型。
如果这样,上面的错误就不会被编译器检测到。
此种错误类型一般是标识符名称不存在或者拼写错误:
然而我们在定义 inti_Board() 函数时却把函数名称错写成 “ initBoard() ”:
这时, 报错:
报错信息:无法解析的外部符号——原因是编译器找不到我们调用的inti_Board()函数。
这就是链接型错误的实例。
这种错误就十分隐蔽了,因为既它无法被编译器检测到,又没有任何报错,这时就需要我们自己通过调试来找bug了,这也就是本文开篇提到的通常情况下我们在找的bug。
调试是找bug的高效方法,以下是VS调试的常用技巧:
F5 —— 开始调试 / 跳到逻辑上下一个断点
F9 —— 设置 / 取消断点
F10 —— 逐行调试
F11 —— 进入函数内部
ctrl + F5 —— 开始运行,不调试
shift + F5 —— 停止调试
在条件语句处可设置条件断点:
这样如果你想观察i从0到365的变化情况,就免去了按365次F10的尴尬操作了;
希望本文对你有所帮助。
完
未经作者同意禁止转载