C语言编程常见错误(二)

 2024-03-04 02:04:37  阅读 0

学习编程,不仅需要知道程序是否有错误以及如何纠正,还需要知道错误在哪里以及计算机为什么会产生这样的错误输出? 计算机的行为都是可以解释的。 需要了解其背后的执行逻辑,而不是简单地修正程序。 这就像学习数学一样。 你不仅需要知道解法是错误的,还需要知道错误在哪里。

在上一篇文章中,我总结了刚接触C语言的同学所犯的十三个错误。

这次我将继续总结学生在课堂上犯的几个错误。

1.语句的case部分忘记写break

例如,下面的简单计算器程序。

c语言判断句型_c语言if语句中判断_判断语句怎么写

输入13-5,发现除了输出13-5=8之外,后面的所有输出语句也都输出了。

c语言if语句中判断_判断语句怎么写_c语言判断句型

原因是上面的代码忘记在每个case处理结束时写break。 如果不写break,程序将不再匹配后面的常量表达式,而是直接一一执行后面的语句,直到遇到break语句或者语句结束。

修改方法:在对应的case末尾添加break;

2. case部分常量类型错误

case后面必须跟常量,不能是变量,并且常量的类型必须与()中的类型一致。 如果类型不一致,就会出现错误。 例如,以下程序根据输入的年份和月份输出该月的天数。

c语言if语句中判断_c语言判断句型_判断语句怎么写

如果编译的话会出现,但是不会有Error。

如果忽略该警告,程序就可以运行。 例如,如果输入为 2023 年 4 月,则输出为 Input。

问题是month是int类型,case后面的单引号括起来的是char类型。 由于char本质上是一个0到255之间的整数,系统可以自动将char类型转换为int类型,因此编译器不会报错。 如果没有‘10’、‘11’、‘12’,编译器甚至不会给出警告信息。

但实际上,字符“4”对应的整数值是ASCII码表中对应的代码52。 因此,进入4月并不会产生“30天”的输出。 相反,如果输入 2023 52,则会得到“30 天”的输出。

另一个错误是直接使用双引号。 因为字符串类型无法自动转换为整数类型,所以编译器会抛出错误。

c语言if语句中判断_c语言判断句型_判断语句怎么写

修改方法:去掉单引号或双引号,直接使用整型常量。

3.大小写和常量之间缺少空格

编译器不会报错,程序可以运行,但执行结果错误。

c语言判断句型_判断语句怎么写_c语言if语句中判断

为什么编译没有错误有点奇怪。 事实上,编译并没有错误,因为编译器将“case1:”的写法理解为语句标签(label)。 这个语句标签可以和goto语句配合使用,这样就不会报错。

修改方法:case后面加一个空格。

4. 与逻辑运算符相关的错误

有同学尝试用if语句编写上述程序,根据年月输出天数。

判断语句怎么写_c语言if语句中判断_c语言判断句型

该程序编译时没有错误,但执行时总是输出。

为什么? 因为像month==1||3这样的表达式并不能判断month是等于1还是3,而是将关系表达式month==1的值与整型常量3的值进行逻辑或运算。 3是非零值,因此逻辑或的结果肯定为真。

修改方法:在每个月份常量前添加month==,如if(month==1||month==3||...)

5.==和=没有区别

这个错误在之前的文章中已经提到过。 再次提及是因为报错有点不同。

这是前面提到的一个典型错误,将==错写成=。 幸运的是,这一次编译器报错了。 一般情况下,如果左边是变量名,编译器不会报错,所以这样的错误会隐藏得更深。 这个编译器错误信息告诉我们,赋值运算符=的左操作数必须是左值,而上面的赋值表达式year%4=0的左边是表达式“year%4”,它不是左值。 。

左值表示占据内存中可识别位置的对象。 此外,左值可以采用地址。 赋值语句中的左操作数必须是左值。 赋值操作本质上是更新内存,所以我们必须找到要更新的内存地址。 注意:常量不能用作左值。

6、if条件表达式后面多加一个分号:

如前所述,在语句末尾不添加分号是初学者的常见错误。 但稍后添加更多分号可能会导致问题,例如:

这时,编译器认为if(op=='+'); 是一条完整的语句,即当op=='+'时,什么也不做,而后面的()与if无关,是一条独立的语句。 无论op是否等于'+',()都会被执行。

修改方法:去掉这个分号。

7. else if() 写成 else()

请注意,else 后面直接跟语句块,不能跟条件表达式。 else if 后面可以跟条件表达式。

判断语句怎么写_c语言判断句型_c语言if语句中判断

修改方法:将else改为else if。

8. 忘记在 while 或 do-while 循环中更改循环变量的值

例如,下面的程序在输入一系列分数后预计会使用负数来标记输入结束,但执行过程中却发现死循环。

判断语句怎么写_c语言判断句型_c语言if语句中判断

问题是分数只输入一次,以后分数值就不会改变。

修改方法:添加一条输入语句 scanf("%d", &score); 到循环体来更改循环变量分数。

判断语句怎么写_c语言判断句型_c语言if语句中判断

一般来说,在使用 for 循环时,忘记修改循环控制变量的情况不太可能发生,但在使用 while 和 do-while 循环时,经常会忘记此项,需要时刻牢记。

9. 不使用break in循环

判断语句怎么写_c语言判断句型_c语言if语句中判断

编译器会报如下错误,它告诉我们:break只能用在循环或。

修改方法:将break改为0或者直接去掉break,改为:

如果(m==1)

("%d 不是素数!\n", m);

别的

...

10. 初始化语句错误地放置在循环体中

有些初学者不知道初始化语句是否应该放在循环体中,从而导致错误。 例如,下面的程序希望计算10! ,但结果是=10。

c语言判断句型_判断语句怎么写_c语言if语句中判断

修改方法:将初始化语句=1移到for循环之前。

双循环中类似这样的错误更多。 您需要了解初始化语句是放在第一个循环外部、第一个循环内部还是第二个循环内部?

11、循环结束条件判断错误

例如,下面的代码用于判断m是否为素数。 原来的算法是用2~(m-1)来除m。 如果无人能整除 m,则 m 是质数。

c语言if语句中判断_c语言判断句型_判断语句怎么写

但其实还有更好的算法,可以用2~√m来除m,所以同学把代码改成了如下:

判断语句怎么写_c语言if语句中判断_c语言判断句型

但是当我运行这段代码时,发现无法正确判断。 该程序始终输出一个非素数。 原因是循环结束条件改变了,但是if()中后续的判断条件却没有做相应的修改。 可以改为if(i>sqrt(m))。

还有一点,在循环中使用break语句后,退出循环有两种情况:一种是不满足循环条件时正常退出循环;另一种是不满足循环条件时正常退出循环。 另一种是通过循环体中的break语句退出。 循环退出后,可以检测循环控制变量的值来判断循环退出的情况,从而执行进一步的操作。

12.函数名未定义

函数名和变量名一样,必须先定义然后使用。

例如,以下代码尝试输出两个自然数之间的所有素数。

c语言判断句型_c语言if语句中判断_判断语句怎么写

但编译会出现未定义的错误。

原因是当它在main()函数中使用时,它还没有被定义,它的定义出现在main()函数之后。

修改方法:

(1)一种方法是将()函数的定义放在main()函数之前;

(2)另一种更通用的方法是不改变()函数的定义,而是在main()函数之前添加函数声明,如下所示。

c语言判断句型_c语言if语句中判断_判断语句怎么写

这里我们可以看到函数声明和定义是可以分开的。 声明只是用来告诉编译器函数的原型是什么样的(即函数名是什么,接受什么类型的参数,返回值是什么类型),但并没有实现(即即函数体),并且函数定义有一个函数体来实现该函数。 其实只需要在函数声明中告知参数类型即可,不需要使用形参名称。 写法如下:

13、函数声明和定义中使用的函数名不一致

这是一个低级拼写错误。 比如声明中写的是int(); 定义里写的是int()。

然后,编译器会提示以下错误信息。 这个错误是链接错误,即没有找到()函数的定义。

修改方法:注意拼写正确。

14、函数的形参与局部变量名同名

判断语句怎么写_c语言if语句中判断_c语言判断句型

编译器会提示如下错误信息:

这个错误信息告诉我们 int n; 这个定义掩盖了一个形式参数。 仔细一看,形参名为n,()函数中定义了一个名为n的局部变量。 操作系统在处理函数调用时,会为形参和非静态局部变量分配存储空间,两者的生命周期都在本次函数调用期间。 事实上,它们可以被视为局部变量。 那么这个名字就不能重复了。

你们都看过了,点赞、观看,只需点击几下即可分享给需要的朋友。

(全文结束)

作者:宣爸爸,博士中国科学院计算机科学博士,大学教授,博士生导师。 曾获得全国初高中数学奥林匹克联赛一等奖、江苏赛区第一名,高考数学满分。 着有畅销书《少儿数学思维课》、《少儿数学思维课》。

经过几年的打磨和实践,爸爸的思维课终于上线了。 扫描二维码即可收听或购买。 更多课程介绍请参见“”

公众号成立6年多,为大家整理了50篇必读文章合集。 欢迎大家阅读和转发! 如果您不想阅读网页,可以直接扫描文末二维码购买书籍。

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码