首页 百科知识 数组 无变量 怎么判断

数组 无变量 怎么判断

时间:2022-10-16 百科知识 版权反馈
【摘要】:对于初学者来说,了解和熟悉一些常见的错误类型及实例可以迅速提高自己的程序纠错和调试能力,即“他山之石,可以攻玉。”不同的数据类型的数值范围不一样,在给相应变量赋值时应避免超过数值范围。这个错误需要程序员自己检查,编译器无法检测出这个错误。不同类型的数据所需要的转换控制序列符不同,在程序设计中一定要注意转换控制序列符的使用方法,针对不同类型的数据正确合理的选用格式说明符。

12.1 常见错误类型

对于初学者来说,了解和熟悉一些常见的错误类型及实例可以迅速提高自己的程序纠错和调试能力,即“他山之石,可以攻玉。”

(1)和main函数相关的错误

所有的C程序都必须包含而且只能含有一个main函数。特别容易出错的是忘记main后面跟随的一对括号,如下所示:

img385

(2)与变量相关的错误

①最常见的即是没有事先声明一个变量就使用该变量。例如:

img386

该类错误编译器能够检测出来,并给出相应提示信息。所有的变量必须先定义后使用,包括数组的使用。下面代码中使用数组的方法也是错误的:

img387

②给变量赋值时防止数值越界。不同的数据类型的数值范围不一样,在给相应变量赋值时应避免超过数值范围。这个错误需要程序员自己检查,编译器无法检测出这个错误。

(3)输入和输出错误

①拼写错误。误将printf或scanf拼写成print或scan,该种错误可以被编译器捕获。

②遗漏双引号。不论是输入还是输出,格式控制部分都必须用双引号引起来。下面的用法是错误的:

img388

③遗漏逗号。格式控制部分和输入(出)项之间用逗号分隔。下面的用法是错误的:

img389

另外,输入(出)项之间也应该用逗号分隔。

④格式说明符误用。不同类型的数据所需要的转换控制序列符不同,在程序设计中一定要注意转换控制序列符的使用方法,针对不同类型的数据正确合理的选用格式说明符。下面的代码就是使用不一致而导致结果出错。

img390

运行结果如图12-1所示。

img391

图12-1

⑤输入数据时遗忘取地址运算符&。在使用scanf()函数输入数据时,需要使用“&”取地址运算符。如果遗漏这个符号编译器无法检查出来,在输入数据时应特别加以注意。例如,下面的用法是错误的:

img392

注意:如果输入项是一个数组名则不必再加取地址符号。下面的用法是正确的:

img393

(4)运算符和表达式相关错误

①表达式中使用到的变量没有赋(初)值。表达式值计算过程中用到的变量值不确定的话直接导致计算出来的值是不确定的值,会引起结果异常。如:

img394

②整除运算符“/”。整除运算符不同于数学中除法运算,如果运算符的两边的操作数都为整型,则计算结果也为整型。例如:

表达式12/5的结果为2,在数学中精确的结果是2.4。如果希望得到更精确的结果应该将表达式描述为12.0/5、12/5.0或者12.0/5.0。

③乘号“*”。由于数学中的习惯,有些C语言的初学者往往在用C表达式描述倍数的问题时漏写“*”。例如,要求描述x的2倍与y的和,2x+y的写法是错误的,正确的应该写为2*x+y。

④强制类型转换。强制类型转换的语法规则为:

(类型)表达式

在具体使用时可能会误用为:

类型(表达式)

例如:

int(a+b) /*错误,应该写为(int)(a+b)*/

(5)选择结构中常见的相关错误

①误加分号“;”。以if语句为例,语法规则为:

if(表达式←─)此处没有分号!

语句

如果在表达式后面误加分号的话将直接影响if语句的正常执行。

②在else后面误加表达式进行判断。以if-else语句为例,语法规则为:

if(表达式)

语句1

else

语句2

不正确的用法举例:

img395

③在使用if语句时括号中的关系表达式误用成赋值表达式。“=”是赋值运算符,“==”为关系运算符,这两个运算符对于初学者来说最容易混淆。一般而言,赋值运算相对于关系运算使用频率更高。此外,在C语言中赋值运算被作为一种操作符对待,因而赋值表达式a=b=10是正确的,并且赋值操作还可以嵌入到更大的表达式中。这种使用上的便利性可能导致一个潜在的问题:原本是想进行关系运算中的相等比较,却错误地运用了赋值运算。这个错误对于编译器来说是无法检测到的,为了让编译器能够帮助检测类似错误,在if语句中使用“==”进行相等比较时,左右两边是可以互换的。如果一边是常量,则把常量放在“==”左边可以防止误用为赋值号“=”。

例如:

int a=2;

if(a==3)printf(“Hello!”);

显然执行if语句时不会输出Hello。若误写为:

if(a=3)printf(“Hello!”);

显然无论a原来的值等于几都会输出Hello。

(6)循环结构相关错误

①循环变量忘记赋初值。这种错误是很危险的,循环变量没有初值会影响到循环结束的条件判断,导致循环的异常。以计算1~10的和为例,下列程序有误:

img396

②缺少改变循环变量值(类似i++、++i等)的语句。这会导致死循环,以计算1~10的和为例:

img397

③误加分号“;”。在循环的条件判断后面没有分号,如果误加分号则表示循环体为空语句,导致循环执行的结果与期望的结果不一致。以计算1~10的和为例:

img398

④漏加花括号{…}。如果一个循环的循环体包含两条或两条以上的语句则应该添加花括号构成复合语句,复合语句在C语言中被认为是一条语句。以计算1~10的和为例:

img399

上述代码也会导致死循环,原因是漏加了一对花括号,执行时循环体只包括sum+=i;一句。

正确的循环体应该是:

img400

⑤do-while循环漏加分号“;”。在do-while循环中要求while(表达式)后面有分号,下列代码有误:

img401

(7)函数相关错误

①函数声明时漏加分号“;”。以计算圆的面积的函数calArea为例,下列声明缺少分号:

double calArea(double r)

②函数声明时缺少参数类型。以计算圆的面积的函数calArea为例,下列声明缺少参数的类型:

double calArea(r);

③函数定义时函数首部误加分号。以计算圆的面积的函数calArea为例,下列定义误加了分号:

img402

④函数调用时实参前面多加数据类型。以计算圆的面积的函数calArea为例,下列调用有误:

img403

(8)数组相关错误

①定义数组时数组长度为变量。定义一个数组时中括号中的内容表示数组元素的个数(数组长度)必须为常量,不允许为变量形式。下面的代码就是错误的:

img404

由于m为变量因此在给整型数组array分配空间时数组的大小是不确定的,因此编译器会报错。

②忘记下标从0开始。这是最容易出现的一个问题,定义一个数组后要始终牢记第一个元素的下标为0。结合循环,在访问数组元素时下列代码有误:

img405

上述代码中会输出a[5]的值,显然不存在这个数组元素,因此输出有误。正确的循环形式应为:

for(i=0;i<5;i++)

二维数组的行下标和列下标同样都从0开始,正确的访问一个二维数组元素的方法如下:

img406

③传递数组参数时出错。结合函数的使用,在函数调用时传递的实参有误,举例如下:

img407

函数声明中的第一个参数为数组形式,但是main函数中调用时传递的实参array[5]是一个数组元素而且是非法的数组元素,正确的实参应为一个数组名。

display(a,5);

④字符数组的初始化。下列代码有误:

img408

正确的初始化为

char ch[20]="Hello";

(9)指针相关错误

①定义指针时的错误。如果想定义两个指针变量,下列代码是实现不了的:

img409

上述语句定义了两个变量,其中pa是指针变量,pb为整型变量而不是指针变量。

②指针变量赋值错误。下列代码有误:

img410

上例中pa为指针变量,其值只能为地址值,因此直接赋上整数100是错误的。

下列代码同样有误:

img411

上述代码中pa为整型指针变量,只能存放整型变量的地址,因此将double型变量d的地址赋值给pa是错误的,要特别注意。

③字符指针的赋值。下列代码比较危险:

img412

因为指针pc没有确定的指向。比较好的做法为:

img413

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈