C语言的调试

时间:2023-01-21 18:12:33
一. 语法错误
/* nogood.c - 一个错误的C程序 */

include (stdio.h)
int main(void){
int n, int n1;
intn3;

n = 5,
n1 = n+ n;
n3 = n1+n1;

printf("输出%d, 输出%d的一倍:%d, 输出%d的两倍:%d", n, n, n1, n, n3);
return 0;
}

上述程序有多处语法错误,如果不遵循C语言的规则就会犯语法错误。由于这是编译器在编译过程中会发生的情况,所以这里不过多赘述。但是有些时候编译器也会由于某处隐藏的语法错误导致编译器误判,编译器另一个常见的毛病就是,报错的位置比真正的错误位置滞后一行。

二. 语义错误

上面的printf输出的内容n3实际上是n的四倍,像这种错误是编译器检查不出来的,我们能够通过逐步跟踪程序的执行步骤,并记录每个变量,便可监视程序的状态。程序状态​是在程序的执行过程中,某给定点上所有变量值的集合,它是程序当前状态的一个快照。

跟踪程序状态以下提供三种方法:1.自己模拟计算机逐步​执行程序,但如果程序有循环语句,这种方法恐怕行不通,不过你可以跟踪一小部分循环,看看程序是否按照预期去执行,另外,还要考虑一种情况:你可能按照自己所想去模拟程序运行,而不是根据实际代码去模拟程序运行。因此,给的建议是尽量忠于代码来模拟。2.在程序中写入printf()语句来输出变量值的变化情况,当程序运行符合预期和实际情况后,便可注释或删除额外的printf()语句,这种方法相较于上种方法更为简便,实用。3.使用编译器带的调试器,编译器是一种程序,建议每个初学者现在就去花点时间去学会如何使用你使用的编译器自带的调试器。

三. 关键字和保留标识符

以下是补充C语言的关键字,不能将它们用作标识符,否则编译器会将其视为语法错误。以下表格中,粗体表示的是C90标准新增的关键字,斜体表示的是C99标准新增的关键字,粗斜体表示的是C11标准新增的关键字。

auto

extern

short

while

break

float

​signed

_Alignas

case

for

sizeof

_Alignof

char

goto

static

_Atomic

const

if

struct

_Bool

continue

inline

switch

_Complex

default

int

typedef

_Generic

do

long

union

_Imaginary

double

register

unsigned

_Noreturn

else

restrict

void

_Static_assert

enum

return

volatile

_Thread_local


除此之外,C语言还有一些保留标识符,C语言已经指定了它们的用途或保留了它们的使用权,尽管它们也是有效的名称,不会引起语法错误,也不能随便使用。保留标识符包括那些以下划线字符开头的标识符和标准库函数名