带你读《C语言程序设计习题解析与上机指导》之三:数据类型、运算符与表达式

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 本书首先介绍了计算机程序设计实验的一般方法以及在Visual C++ 2010下编写和调试C语言程序的具体步骤,然后对主教材各章后面的习题以及C语言程序设计课程学习中的疑难问题和常见问题进行了详细的解析,同时还汇总了各章的知识重点。在第三部分,精心设置了9个上机实验,每个实验项目都给出了实验目的和要求,并给出了编程示例和练习题目。读者可以通过由浅入深的实际训练,逐步熟悉编程环境,掌握程序调试方法,理解和掌握程序设计的思想、方法和技巧。

点击查看第一章
点击查看第二章

第3章数据类型、运算符与表达式

3.1本章知识重点

1)C语言的基本词汇表和关于标识符的规定。
2)变量和常量:在程序运行过程中其值可以改变的量称为变量。变量具有数据类型、变量名、变量值和存储类型四个属性。变量在其存在期间,在内存中按照定义的类型占据不同长度的存储单元,并可以用来多次存放不同的数值。在程序运行过程中其值不能改变的量称为常量,其类型是由本身隐含的类型决定的。
3)转义字符:转义字符是一种特殊的字符常量,C语言约定以“”开头作为标记的字符序列为“转义字符”,学习中需要记住几个常用的转义字符。
4)字符常量和字符串常量的区别:字符常量与其对应的ASCII码等价,用单引号表示。字符串常量中的字符依次存储在内存中一块连续的区域内,并把空字符'0' (ASCII值为0)自动地附加到字符串的尾部作为字符串的结束标志,用双引号表示。
5)C语言中的数据类型:不同数据类型的数据具有不同的类型说明符,在内存中具有不同存储长度以及不同的取值范围和允许的操作。
6)运算符:C语言中的运算符不单单是我们通常认为的进行数学运算的符号,而是具有更加广泛的含义。C语言将描述各种操作的符号通称为运算符,除了控制语句和输入、输出以外的几乎所有基本操作都用运算符处理,所以有些文献中将其称为“操作符”。运算符具有两个属性:优先级和结合性(结合方向)。
7)表达式:用运算符将被操作对象连接起来,符合C语言语法的式子称为表达式。表达式的值也可以说是表达式的运算结果,所有表达式的值只有两类:数值和地址。
8)表达式求值的语法规则:当若干个不同优先级的运算符同时出现在表达式中时,运算符的优先级规定了运算的先后次序。当若干个具有相同优先级的运算符相邻出现在表达式中时,结合方向规定了运算的先后次序。一般来说,大多数运算符的结合方向为“从左到右”,只有单目运算符、赋值运算符和条件运算符的结合方向为“从右到左”。
9)几种表达式求值需要注意的问题:

  • 算术表达式:应注意在除法运算中,两个整数相除的结果为整数。取余运算只能作用于两个整型数,并且规定运算结果的正负符号与被除数的符号一致。
  • 赋值表达式:赋值运算符的优先级很低,仅高于逗号运算符。结合方向为“从右到左”,注意在运算中将右边表达式值的类型无条件地转换为左边变量的类型。要理解复合赋值运算符的含义,并学会正确的使用方法。
  • 逗号表达式:逗号运算符的优先级最低,逗号表达式的值和类型就是最右边的表达式的值和类型。
  • 自增运算和自减运算:自增运算和自减运算实质上是对于算术运算和变量赋值运算两种运算的结合。注意“++变量”或“变量++”出现在表达式中时求值的时机不同。

3.2习题解析

3.2.1计算题

设变量定义如下:

char a='a'; int i=3,j=5,b;  
float x=2.5; double y=5.0, z;

计算下面表达式的值。

  1. y+=i-=j*=++x;

【答案】 -9.0
【解析】 表达式中出现三个复合赋值运算符和一个自增运算符,因为自增运算符优先级最高,先计算++x,然后再从右向左依次计算。
1)计算++x:结果x值为3.5。
2)计算j=++x相当于计算j=j3.5:先计算j*3.5值为17.5,将17.5赋予整型变量j,再做j=17.5,C语法规定以赋值表达式左边的变量类型作为表达式值的类型,结果j值为17。
3)计算i-=j*=++x相当于计算i=i-17,i=3-17,结果i值为-14。
4)计算y+=i-=j*=++x相当于计算y=y+(-14),y=5.0-14,结果y值为-9.0,表达式的值为-9.0。

  1. a=a+i, a+j

【答案】 105
【解析】 题中优先级最低的运算符是逗号运算符,所以是一个逗号表达式,从左向右依次计算每一个表达式,逗号表达式的值和类型就是最右边的表达式的值和类型。
1)计算a=a+i,结果a='a'+3, 变量a值为'd'。
2)计算a+j相当于计算'd'+5或者100+5('d'的ASCII码为100),因为变量a为字符型,变量j为整型,根据“类型向高转换”的规则,表达式a+j的运算结果为整型105。
3)表达式a+j的值为105,变量a值为'd'。

  1. a=(a+=i++, a+i)

【答案】 'h'
【解析】 括号运算符优先级最高,应先计算括号中的逗号表达式,再将该逗号表达式的值赋予变量a。
1)计算表达式i++,因为该表达式此时没有参与运算,所以暂不求值,变量i仍然等于3。
2)计算a+=i++相当于计算a=a+i,a='a'+3或者a=97+3('a'的ASCII码为97),因为变量a为字符型,表达式a=a+i的运算结果为变量a(等于'd')。
3)对表达式i++求值,相当于计算i=i+1,变量i等于4。
4)计算a+i相当于计算'd'+4:根据“类型向高转换”的规则,表达式a+i的运算结果为整型104。括号中的逗号表达式结果为整型104。
5)将104赋予变量a,表达式的值为'h',变量a值为'h'('h'的ASCII码为104)。

  1. (int)y% i %(int)(x+y)

【答案】 2
【解析】 该表达式做两次取余运算,是算术表达式。因为取余运算只能作用于两个整型数,所以首先需要对非整型表达式的值进行强制类型转换。
1)对变量y的值强制类型转换为整型,结果为5。
2)计算5% i相当于计算5%3,结果为2。
3)计算(int)(x+y),将表达式x+y的值7.5强制类型转换为整型,结果为7。
4)计算2%7,表达式的值为2。

  1. i+++j

【答案】 8
【解析】 该表达式形式上有三个加号,可以分解为一个自增运算符和一个加法运算符,是一个算术表达式。从左向右开始计算,首先将自增运算符和变量i结合,然后将i++的结果和变量j相加。可以将表达式等价表示为(i++)+j。
1)计算表达式i++,因为该表达式此时没有参与运算,变量i仍然等于3。
2)计算3+j相当于计算3+5,运算结果为8,表达式的值为8。
3)对表达式i++求值,相当于计算i=i+1,变量i等于4。

3.2.2选择题

  1. 下面转义字符中,错误的是(  )。
    A. ' 0xa5 ' B. ' 031 ' C. ' b ' D. ' " '

【答案】 A
【解析】 C语言中有一些特殊的字符,约定以“”开头作为标记,这类字符统称为“转义字符”,从字面上理解就是将反斜杠“”后面的字符转换成另外的意义,用于代表一种特定的控制功能或表示一个特别的字符。
本题中,转义字符' 031 ' 表示八进制所代表的字符。转义字符' b '表示退格操作,将当前位置移到前一列。转义字符' " ' 表示双撇号字符,而字符' ' 加1到2位十六进制数表示与该十六进制数对应的ASCII码所代表的字符。' 0xa5 '有4位十六进制数,不符合要求,如果去掉字符“”,' 0xa5 '表示一个十六进制数整型常量。

  1. 字符串"\\1234\\n"在内存中占(  )字节。
    A. 14 B. 9 C. 10 D. 11

【答案】 C
【解析】 字符串常量中的字符依次存储在内存中一块连续的区域内,并把空字符'0' (ASCII 值为0)自动地附加到字符串的尾部作为字符串的结束标志。每个转义字符和其他字符一样,在内存中占1个字节。因此,对于字符个数为n的字符串,所占内存空间应为n+1个字节。
首先计算字符串中一共有多少个字符,注意不要简单地数字符的个数,当遇到字符''时,应该考虑转义字符的判别。“\”为一个转义字符,该字符串中共有4个转义字符,'n'也是一个转义字符。除此之外,还有4个普通字符'1'、'2'、'3'、'4'。另外,字符串的结束标志'0'也占1个字节,所以该字符串在内存中占字节数为4+1+4+1=10。如果该题改为求字符串的长度,答案应该是9。

  1. 已知梯形的上底为a,下底为b,高为h,用C语言书写的正确的面积公式为(  )。
    A. 1/2(a+b)h B. 1.0/2(a+b)h C. 1.0/2.0(a+b)h D. 1.02a+bh

【答案】 B
【解析】 A项1/2(a+b)h中的1/2由于是两个整数相除,结果为整数0,导致整个表达式的计算结果为0。
B项1.0/2(a+b)h中的1.0/2由于是浮点数和整数相除,结果为浮点数0.5,修改了A项的错误,是一个符合C语言语法的正确算术表达式。
C项1.0/2.0(a+b)h中的两项相乘应该用算术运算符''连接,这种写法在一般数学代数运算中使用,但不符合C语言语法,可以改为1.0/2.0(a+b)*h。
D项1.02a+bh的语法没有问题,但根据算术运算符的优先级计算出的结果不是梯形的面积。

  1. 与k=n++完全等价的表达式是(  )。
    A. n=n+1, k=n B. k+=n+1 C. k=++n D. k=n, n=n+1

【答案】 D
【解析】 表达式k=n++的计算步骤是:
1)按照运算符的优先级,先计算表达式n++,相当于计算k=n++, 因为该表达式是后置自增运算,所以暂不求值。
2)计算k=n++, 相当于先计算k=n。
3)再对表达式n++求值,相当于计算n=n+1。
D项是正确的,B项可改写为k=k+(n+1), C项相当于n=n+1, k=n,与A项相同。

  1. 设变量定义如下:
  2. i=8, k, a, b;

double x=1.42,y=5.2;
则以下符合C语言语法的表达式是(  )。
A. a=a3=2 B. a+=a-=(b=4)(a=3) C. y=float(i) D. x%(-3)

【答案】 B
【解析】 A项表达式a=a3=2首先将2赋予a3,由于赋值表达式左边必须是变量,不能是表达式,所以这是错误的写法。C项表达式y=float(i)的表示方法不正确,应该写成y=(float)i。D项表达式x%(-3)中的变量x是双精度实型,不可以进行取余运算。

  1. 假定变量定义如下:
  2. k=7,x=12;

则以下能使值为3的表达式是(  )。
A. x%=(k%=5) B. x%=(k-k%5) C. (x%=k)-(k%=5) D. x%=k-k%5

【答案】 C
【解析】
A项 x%=(k%=5) 的计算过程:x=x%(k=7%5)→ x=x%(k=2)→ x=12%2→x=0。
B项 x%=(k-k%5) 的计算过程:x=x% (k-k%5)→ x=12% (7-7%5) →x=12% (7-2) → x=12%5→x=2。
C项 (x%=k)-(k%=5) 相当于(x=x%k)-(k=k%5),计算过程: (x=5)-(k=2)→5-2→3。
D项 x%=k-k%5 相当于x=x% (k-k%5),结果同B。

  1. 下列关于自增运算符++和自减运算符--的叙述中,正确的是(  )。
    A. 它们的运算对象可以是任意变量和常量。

B. 它们的运算对象可以是char型变量和 int型变量,但不能是float型变量。
C. 它们的运算对象可以是int型变量,但不能是double型变量和float型变量。
D. 它们的运算对象可以是char型变量、int型变量和float型变量。

【答案】 D
【解析】 自增运算符++和自减运算符--只能用于变量,不能用于常量和表达式,但对变量的类型没有限定。

相关文章
|
1月前
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
114 2
|
28天前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
1月前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
101 52
|
24天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
112 14
|
28天前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
43 8
|
28天前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
321 6
|
28天前
|
C语言
【C语言】条件运算符详解 - 《 A ? B : C 》
条件运算符(也称为三元运算符)是C语言中唯一的三元运算符。它通常用于替代简单的 `if-else` 语句。
90 6
|
28天前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
35 5
|
28天前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
39 5
|
28天前
|
安全 搜索推荐 Unix
【C语言】《回调函数》详细解析
回调函数是指一个通过函数指针调用的函数。它允许将一个函数作为参数传递给另一个函数,并在特定事件发生时执行。这种技术使得编程更加灵活,可以动态决定在何时调用哪个函数。
43 1

推荐镜像

更多