- C语言程序设计习题与实验指导
- 孟东霞主编
- 1949字
- 2025-04-02 16:22:10
2.2 典型例题分析
2.2.1 例题解析
【例2.1】有变量说明语句int a=9;,则执行完语句a+=a-=a*a;后,a的值是( )。
A. 9
B. 114
C. 0
D. −114
解:此题应用了复合赋值语句的运算规则。赋值语句的结合性为“自右至左”,复合赋值语句可以分解进行。将语句a+=a−=a*a;分解成如下两条语句:a−=a*a; a+=a;,由第一条语句可以算出a的值为−72,由第二条语句算出a的值为−114。答案为D。
【例2.2】在下列选项中,不合法的赋值语句是( )。
A. n1=n2=n3=0;
B. k=i==j;
C. k=i&&j
D. a=b+c=1
解:此题应用了赋值语句的书写规则。选项A相当于n3=0; n2=n3; n1=n2;,所以合法;选项B相当于k=(i==j);,即赋值号右侧是关系表达式,当i和j相等时,k赋值为1,否则k赋值为0,合法;选项C中赋值号右侧是逻辑表达式,当i和j均非零时,k赋值为1,否则k赋值为0,也合法;选项D相当于a=((b+c)=1);,可见右边的赋值号的左侧不是变量名,而是表达式,所以不合法。答案为D。
【例2.3】设f为浮点型变量,下面表达式能实现对变量f的值小数点后第三位进行四舍五入的表达式是( )。
A. f=(f*100+0.5)/100.0
B. f=(f*100+0.5)/100
C. f=(int) (f*100+0.5)/100.0
D. f=(f/100+0.5)*100
解:此题涉及类型转换,当实数到整型数据进行强制类型转换时,将实数的小数部分全部舍去。若要对小数部分进行四舍五入处理,则应加上0.5后再取整。题目要求在小数点后第三位进行四舍五入处理,即小数点后保留两位,对于浮点型变量f,先放大100倍,然后通过加0.5后取整,达到在小数点后第三位进行四舍五入的处理,此时得到的数是放大100倍后的整型数据,再缩小100倍,即为所求。答案为C。
【例2.4】以下选项中不合法的字符常量是( )。
A. '2'
B. '\101'
C. 'ab'
D. '\n'
解:此题应用了C语言的字符常量规则。C语言的字符常量是用单引号括起来的单个字符,因此选项A是合法的字符常量。同时C语言还允许一种特殊形式的字符常量,就是以“\”开头的字符序列,即转义字符,选项B和D是合法的转义字符,它们分别表示字符A和换行。选项C是用单引号括起来的两个字符,因此是不合法的字符常量。答案为C。
【例2.5】以下程序的输出结果是( )。
main( ) { int i=1, j=2, k=3; if (i++==1&&(++j==3||k++==3)) printf("%d%d%d\n ", i, j, k); }
A. 1 2 3
B. 2 3 4
C. 2 2 3
D. 2 3 3
解:此题考查逻辑表达式中“短路”时的计算。在逻辑表达式中,当“&&”运算的第一个表达式的值为“假”时,第二个表达式不再运算;当“||”运算的第一个表达式的值为“真”时,第二个表达式将不再运算。本题表达式i++==1&&(++j=3||k++==3)中,先运算第一个表达式i++==1,其值为“真”,i的值变为2。接着计算第二个表达式(++j==3||k++==3)。先运算++j==3,其值为“真”,j值变为3,这时不再计算k++==3表达式,因此k值保持不变。所以i,j,k的值分别为2,3,3。又因为整个表达式i++==1&&(++j==3||k++==3)的值为真,因此执行输出语句,输出结果为2 3 3。答案为D。
2.2.2 常见错误
1. 编程语句中,直接使用未定义的变量
在C语言中,变量必须先定义后使用。例如:
void main() { int a, b; a=5; c=a+b; printf("%d", c); }
编译程序显示出错信息:变量c没有定义,同时变量b没有赋初值,运行结果将与原意不符。应改为:
void main() { int a, b, c; a=5; b =5; c=a+b; printf("%d", c); }
2. 书写标识符时,忽略了大小写字母的区别
在C语言中,变量是区分字母大小写的。例如:
void main() { int a=5; printf("%d", A ); }
编译程序认为a和A是两个不同的变量名,故而显示出错信息。习惯上,符号常量名用大写字母表示,变量名用小写字母表示,以增加程序的可读性。
3. 忽略了变量的类型,进行不合法运算
void main() { float a, b; printf("%d", a%b ); }
“%”是求余数运算,运算后得到a/b的整余数。整型变量a和b可以进行求余数运算,而实型变量则不允许进行求余数运算。
4. 混淆了字符变量与字符串的概念
字符常量是由一对单引号括起来的单个字符,字符串常量是由一对双引号括起来的字符序列。C语言规定,可用“\0”作为字符串的结束标志,该标志由系统自动添加。例如:
char c; c = "a";
这里的赋值语句混淆了字符变量与字符串的概念,字符串"a"实际上包含两个字符:'a' 和 '\0',把字符串赋给一个字符变量是错误的。
5. 输入变量时忘记加地址运算符“&”
scanf()函数中,输入参数的变量名前必须加地址运算符“&”,用于存放接受输入的数据。
int a, b; scanf( "%d %d", a, b);
这里的scanf语句是不合法的。scanf()函数的作用是,按照a、b在内存的地址,将a、b的值存进去。"&a"指的是a在内存中的地址。应改为:
scanf("%d %d", &a, &b);
6. 输入数据的方式与要求不符
C语言中规定,如果在“格式控制”字符串中,除格式说明外,还有其他字符,则应在输入数据时,输入与这些字符相同的字符。例如:
(1)scanf("%d %d", &a, &b);
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键或跳格键间隔。
(2)scanf("%d, %d", &a, &b);
若输入“3, 4”,此时不用逗号而用空格或其他字符是错误的。
(3)scanf("a=%d, b=%d", &a, &b);
输入应采用如下形式:a=3,b=4。
7. 输入/输出的数据类型与所用格式说明符不一致
对于格式化输入/输出函数scanf()和printf(),在参数列表列出的数据项中,数据的类型、个数和位置必须与格式控制字符串中的格式控制说明符一—对应。
例如:
int a; float b; a =3; b=4.5; printf("%f %d", a, b);
编译时不会给出出错信息,但运行结果将与预期结果不符。这种错误尤其需要注意。