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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 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语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
66 16
|
1月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
77 18
|
1月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
57 18
|
1月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
52 13
|
1月前
|
存储 安全 C语言
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
分支的语句,这可能不是预期的行为,这种现象被称为“case穿透”,在某些特定情况下可以利用这一特性来简化代码,但在大多数情况下,需要谨慎使用。编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。根据提示,在右侧编辑器补充代码,计算并输出最终预测的身高。分支下的语句,提示用户输入无效。常量的值必须是唯一的,且在同一个。语句的作用至关重要,如果遗漏。开始你的任务吧,祝你成功!,程序将会继续执行下一个。常量都不匹配,就会执行。来确保程序的正确性。
71 10
|
1月前
|
小程序 C语言
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
40 10
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
37 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
20 2
|
1月前
|
存储 C语言
【C语言程序设计——循环程序设计】利用数列的累加和求 sinx(头歌实践教学平台习题)【合集】
项的累加和,一般会使用循环结构,在每次循环中计算出当前项的值(可能基于通项公式或者递推关系),然后累加到一个用于存储累加和的变量中。在C语言中推导数列中的某一项,通常需要依据数列给定的通项公式或者前后项之间的递推关系来实现。例如,对于一个简单的等差数列,其通项公式为。的级数,其每一项之间存在特定的递推关系(后项的分子是其前项的分子乘上。,计算sinx的值,直到最后一项的绝对值小于。为项数),就可以通过代码来计算出指定项的值。对于更复杂的数列,像题目中涉及的用于近似计算。开始你的任务吧,祝你成功!
51 6
|
1月前
|
C语言
【C语言程序设计——循环程序设计】鸡兔同笼问题(头歌实践教学平台习题)【合集】
本教程介绍了循环控制和跳转语句的使用,包括 `for`、`while` 和 `do-while` 循环,以及 `break` 和 `continue` 语句。通过示例代码详细讲解了这些语句的应用场景,并展示了如何使用循环嵌套解决复杂问题,如计算最大公因数和模拟游戏关卡选择。最后,通过鸡兔同笼问题演示了穷举法编程的实际应用。文中还提供了编程要求、测试说明及通关代码,帮助读者掌握相关知识并完成任务。 任务描述:根据给定条件,编写程序计算鸡和兔的数量。鸡有1个头2只脚,兔子有1个头4只脚。
57 5

热门文章

最新文章

推荐镜像

更多