
实验2 数据类型、运算符和表达式
1. 实验目的
(1)掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法;
(2)掌握不同的数据类型之间赋值的规律;
(3)学会使用C语言的有关算术运算符,以及包含这些运算符的表达式,特别是自增和自减运算符的使用。
2. 实验指导
1)输入并运行下面程序,分析输出结果

(1)要求:
①运行此程序,分析结果;
②修改程序,将语句①改为“int ch;”,运行程序,分析结果;
③修改原程序,将语句②改为“ch=65;”,运行程序,分析结果;
④修改原程序,将语句③改为“printf("The value of ch is%d\n",ch);”,运行程序,分析结果;
⑤修改原程序,将语句③改为“printf("The value of ch is%f\n",ch);”,运行程序,分析结果;
⑥修改原程序,将语句②改为“ch="A"+32;”,运行程序,分析结果;
⑦修改原程序,将语句②改为“ch="A";”,运行程序,分析结果;
⑧修改原程序,将语句②改为“ch=A;”,运行程序,分析结果。
(2)分析指导:
①根据程序的算法过程,画流程图,如图2-9所示;

图2-9 基本程序流程图
②输出结果为The value of ch is A,语句③按字符形式(%c)输出字符型变量ch的值;
③输出结果同样为The value of ch is A,语句②将字符'A'的ASCII码值(65)赋值给整型变量ch,语句③按字符形式(%c)输出整型变量ch的值;
④输出结果为The value of ch is 65,语句③按十进制整数形式(%d)输出字符型变量ch的值,实际输出字符型变量ch的ASCII码值;
⑤程序将不能输出正确结果,字符型变量的值能够以十进制整数形式或字符形式输出,但不能以其他形式输出,同理,整型变量的值也能够以十进制整数形式或字符形式输出,但不能以其他形式输出;
⑥输出结果为The value of ch is a,由于字符型常量或变量可以看作是与其ASCII码值等值的整型常量或变量,因此字符型量可以与整型量直接进行运算,语句②“ch='A'+32;”是将'A'的ASCII码值(65)与32相加,并将ASCII码值为97的字符'a'赋值给ch变量;
⑦程序将不能输出正确结果,因为语句②在给字符型变量赋值时有误,应该使用单引号;
⑧程序将不能输出正确结果,同样因为语句②在给字符型变量赋值时有误,应该使用单引号。
(3)VC++ 6.0环境调试过程:
①按下F10键,开始调试,黄箭头指示调试的开始位置,如图2-10所示。注意:黄箭头指向的是即将执行的程序行。

图2-10 黄箭头指示调试开始位置
②按F10键继续单步调试,声明字符变量ch,黄箭头指向ch='A'程序行,变量窗口中的ch内容为“-52'?”,说明变量已在内存空间初始化完毕,如图2-11所示。

图2-11 变量窗口中ch变量的初始化
③按F10键继续单步调试,黄箭头指向printf()函数行,字符变量ch已赋值为A,变量窗口中的ch内容为“65'A'”,以红色表示变量发生的改变,说明内存空间中保留了字符常数A,如图2-12所示。

图2-12 变量窗口中给字符变量ch赋值为常量A
④按F10键继续单步调试,黄箭头指向结束行},如图2-13所示;在运行窗口中显示结果The value of ch is A,如图2-14所示。

图2-13 黄箭头在}处结束调试

图2-14 运行窗口中显示结果
2)输入并运行下面程序,分析输出结果

(1)要求:
①运行此程序,分析结果;
②修改程序,将语句④改为“x=a––;”,语句⑤改为“y=––b;”,运行程序,分析结果;
③修改原程序,将语句⑥改为“printf("a=%d,b=%d\n",a++,++b);”,运行程序,分析结果;
④修改原程序,将语句⑥改为“printf("a1=%d,a2=%d,a3=%d\n",a,++a,a++);”,运行程序,分析结果。
(2)分析指导:
①输出结果为“a=2,b=2,x=1,y=2”,后缀自增运算符是在当前语句执行完毕才进行变量自增操作,语句④等价于“x=a;a=a+1;”;前缀自增运算符是先执行变量的自增操作,然后再参与运算,语句⑤等价于“b=b+1;y=b;”。
②输出结果为“a=0,b=0,x=1,y=0”,后缀自减运算符是在当前语句执行完毕才进行变量自减操作,语句④等价于“x=a;a=a–1;”;前缀自减运算符是先执行变量的自减操作,然后再参与运算,语句⑤等价于“b=b–1;y=b;”。
③输出结果为“a=2,b=3”,在执行完语句⑤之后,a=2,b=2,在函数参数中的后缀自增运算符是在函数执行完毕之后进行自增操作,因此a=2,而在函数参数中的前缀自增运算符是先进行自增操作,然后参与函数运算,因此b=3。
④输出结果为“a1=3,a2=3,a3=2”,在执行完语句⑤之后,a=2,b=2。在函数参数中的变量运算顺序为从右至左,因此先计算printf()函数中的a++,因为是后缀自增运算,此时a值不变,所以输出a3=2;然后计算++a,因为是前缀自增运算,此时a值自增1(a=3),所以输出a2=3;最后计算“a”,因为此时a值已经为3,所以输出a1=3。
3. 实验内容
(1)编辑、编译、运行实验指导中给出的程序,并分析输出结果。
(2)要将China译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母。例如,字母A后面第4个字母是E,用E代替A。因此,China应译为Glmre。请编一个程序,用赋初值的方法使c1、c2、c3、c4、c5五个变量的值分别为'C'、'h'、'i'、'n'、'a',经过运算,使c1、c2、c3、c4、c5分别变为'G'、'l'、'm'、'r'、'e',并输出密码。
①画出算法流程图,输入事先已编好的程序,并运行该程序。分析是否符合要求。
②改变c1、c2、c3、c4、c5的初值为'T'、'o'、'd'、'a'、'y',修改程序并运行(注意:对译码规律作如下补充:'W'用'A'代替,'X'用'B'代替,'Y'用'C'代替,'Z'用'D'代替)。
③修改程序,完成上述译码规则的解码操作,并将密码PSZI解码成明文。