C primer plus 第三章

本文详细介绍了C语言中的数据类型,包括整型、浮点型、字符型及其转换说明,以及变量的声明和初始化。同时,探讨了内存单位如位、字节和字的概念,并阐述了不同数据类型的取值范围和默认存储方式。还涉及到了转义序列、浮点数的p记数法以及printf函数的使用规则。此外,文章通过示例展示了整数上溢、浮点数上溢和下溢的现象。
摘要由CSDN通过智能技术生成
  1. %.2f输出的浮点数只显示小数点后两位

  2. 42是整数,42.0是浮点数

  3. 最小的储存单位是位——bit(可以储存0或1),是计算机内存的基本构建块

  4. 字节——byte,1字节=8位(c语言有不同定义3.4.3),是常用的计算机储存单位

  5. 字——word,是设计计算机是给定的自然存储单位。8位机~64位机

  6. char类型在C语言中占1字节,在Java中占2字节

  7. 声明:
    int a;
    int a,b,c;

  8. 初始化变量——为变量赋值:
    可在声明时直接初始化:int a = 10;

  9. 用printf()函数时,转换说明的数量与待打印的值的数量要相同

    1. 0x或0X前缀表示16进制:0x10=16(10进制)
  10. 0前缀表示8进制:010=8, 0x10=020

数据类型转换说明备注
int%d /%i带符号的十进制形式整数
unsighed(int)%u无符号的十进制形式整数
float%f小数点形式的单精度实数,浮点数,十进制记数法(默认小数点后6位)
double%lf小数点形式的双精度实数,浮点数,十进制记数法(默认小数点后10位)
char%c字符
char[ ]%s字符串
*p%p指针(地址)
%a或%A浮点数,十六进制数和p计数法
%e %E标准指数形式的单、双精度实数,浮点数,e记数法
%o无符号的八进制形式整数
%x或%X无符号的十六进制形式整数
%g选用宽度较小的格式输出实数,自动选择合适的表示方法
%%打印%

ps.虽然C语言允许用大小写的常量后缀,但是转换说明只能用小写
13. int为32位为前提

类型描述关键字字节数取值范围默认值
字节型byte1-128 ~ 1270
短整型short2-32768~327670
整型int4-2147483648~21474836470
长整型long8-9223372036854775808~92233720368547758080
单精度浮点型float4大约+ - 3.40282347+38F0.0f
双精度浮点型double8大约1.79769313486231570E0.0e
字符型char10 ~ 65535\u0000
布尔型boolean1true / falsefalse

ps:
unsigned int / unsigned:0~4294967295
char类型在C语言中占1字节,在Java中占2字节

  1. 字符常量——用单引号括起来的单个字符
    eg:
‘T’是一个字符
“T”是一个字符串
T是一个变量名
  1. 字符一数值的形式储存的所以可以用数字代码赋值,但最好使用字符常量,而不是数字代码。
    eg:
char grade = 65;(65是int类型但它在char的表示范围内,所以此时不会出错,但不推荐,应该用‘A’代替65才好)

16.C将字符常量视为int而不是char
eg:

在int为32位、char为8位的ASCII 系统中,有下面的代码:
char grade = 'B';
本来'B'对应的数值66储存在32位的存储单元中,现在却可以储存在8位的存储单元中(grade)
利用字符常量的这种特性,可以定义一个字符常量'FATE',即把4个独立的8位ASCII 码储存在一个32位存储单元中。
如果把这样的字符常量赋给char类型变量grade,只有最后8位有效。因此,grade的值是'E'。

17.把转义序列赋给字符变量时,要用单引号把转义序列括起来
eg:

char 换行 = ‘\n’

双引号括起来的字符串,就无需用单引号

ps:.ASCII码时真的难

  1. printf()转换说明决定数据的显示方式而不是存储方式。

  2. 默认情况下(没有后缀的)浮点型常量时double类型
    eg:

7.0——double
7.0f——float
7.0L——long double (l也可以但比较容易和1混淆,推荐L)

3.10复习题:

复习题:

  • a. int类型,也可以是short类型或unsigned short类型。人口数是一个整数。
    b. float类型,价格通常不是一个整数(也可以使用double类型,但实际上不需要那么高的精度)。c. char类型。
    d. int类型,也可以是unsigned类型。

  • 原因之一:在系统中要表示的数超过了int可表示的范围,这时要使用long类型。原因之二:如
    果要处理更大的值,那么使用一种在所有系统上都保证至少是32位的类型,可提高程序的可移植性。

  • int 32_t——正好
    int_least 32_t——最小
    int_fast 32_t——最快

  • a. char类型常量(但是存储为int类型)
    b. int类型常量
    c. double类型常量 默认情况下(没有后缀的)浮点型常量时double类型
    d. unsigned int类型常量,十六进制格式 八进制和十六进制整型,系统优先解释为无符号类型;
    e.double类型常量 默认情况下(没有后缀的)浮点型常量时double类型

  • 找出程序中的错误;

#include<stdio.h>
int main()
{
	float g, h;
	float tax, rate;

	rate = 0.08;
	g = 1.0e5;
	tax = rate * g;
	h = g + tax;
	printf("You owe $%f plus $%f in taxes for a total of $%f.\n",g,tax,h);

	return 0;
}
  • 写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明。
    在这里插入图片描述

  • 0x3是用16进制表示值
    %x不带前缀0x
    当八进制和十六进制数据需要显示前面的 00x时,要使用 %#o%#x 转换说明符。
    为了显示大写 X,转换说明中也需要使用大写 X。即 %#X

  • 0x5.b6p12 是浮点类型数据的p记数法。
    p记数法 :c99里的16进制浮点数计数法,非c99不可用。数以0x开头,后面紧跟16进制小数,后跟p,再跟以2为底的阶码。
    5.b6=5乘16的0次方+11乘16进制的-1次方+6乘16进制的-2次方。
    p12=2的12次方;

所以0x5.b6p12=[5 * 16^0 + 11 * 16^(-1) + 6 * 16^(-2) ] * (2^12);

  1. 写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明(假设 int 为16位)
  • 2.9e05L默认是double但是L后缀所以是long double
  • 0x44的转换说明有误,应为%#x
    %x不带前缀0x
  • 100000是long因为int是16位,取值范围是-32768~32768(2^15-1)
  1. 假设程序的开头有以下声明。
int imate =2;
long shot =53456;
char grade = ‘A’
float log =2.71828;

把下面printf()语句中的转换字符补充完整:

printf("The odds against the %d were%ld to 1.\n",imate,shot);
printf("A score of %f is not an %c grade.\n",log,grade);
  1. 假设ch是char类型的变量。分别使用转义序列,十进制值,八进制字符常量和十六进制字符常量把回车字符赋给ch(假设使用ASCII编码值).
1.转义序列:ch='\r'
2.十进制值:ch=13
3.八进制值:ch='\015'
4.十六进制值:ch='\xD'
  • %c转换说明告诉printf()打印盖整数对应的字符
  • 把转义序列赋给字符变量时,要用单引号
#include<stdio.h>
int main()//this program is perfect
{
	int cows, legs;
	printf("How many cow legs did you count?\n");
	scanf_s("%d", &legs);
	cows = legs / 4;
	printf("That implies there are %d cows.\n", cows);
	
	return 0;
}
  1. 指出下列转义序列的含义:
    a.\n——换行
    b.\——反斜杠( \ )
    c."——双引号( " )
    d.\t——水平制表符

3.11 编程练习:

1.通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢,浮点数上溢和浮点数下溢的情况。
  1. 整数上溢:
#include<stdio.h>
int main()
{
	int a = 2147483647;
	unsigned int b = 4294967295;

	printf("%d %d %d\n", a, a + 1, a + 2);
	printf("%u %u %u\n", b, b + 1, b + 2);

	return 0;
}

在这里插入图片描述
整数上溢:
由最大值~最小值,随后从最小值开始递加。
(有无符号类型规律相同)

  1. 浮点数上溢:
#include<stdio.h>
int main()
{
	float a = 3.4e38 * 100;

	printf("%e\n",a);

	return 0;
}

在这里插入图片描述
inf(infinity)——无穷

ps:

#include<stdio.h>
int main()
{
	float a = 3.4e100 * 100.0;

	printf("%e\n"//这里忘打了printf()函数的参数,得出了不一样的结果,且同一个代码得出的值不同,说明是随机取值。);

	return 0;
}

在这里插入图片描述
在这里插入图片描述

  1. 浮点数的下溢:
#include<stdio.h>
int main()
{
	float a = 0.123456789e-10;

	printf("%e\n",a/10);

	return 0;
}

在这里插入图片描述

2.编写一个程序,要求提示输入一个ASCII码值(如66),然后打印输入的字符:
#include<stdio.h>
int main()
{
	int input;
	printf("Enter an ASCII value\n");//提醒输入一个ASCII码的值
	scanf_s("%d", &input);//通过scanf()函数读取输入值,将其赋给 input 变量
	printf("%c\n", input);//输出结果。

	return 0;
}
3. 编写一个程序,发出一声警报,然后打印下列文本:
Starled by the sudden sound, Sally shouted,

“By the Great Pumpkin, what was that ! ”
#include<stdio.h>
int main()
{
	char BEL = '\a';
	//警报是 \a 或者 7 ,但建议使用转义序列 \a ,避免使用整数赋值。
	printf("%c", BEL);
	printf("Starled by the sudden sound, Sally shouted,\n\"By the Great Pumpkin, what was that !\"\n");
	//用 \" 打印"是好习惯

	return 0;
}
  1. 编写一个程序,读取一个浮点数,先打印小数形式,然后打印指数形式。然后,如果系统支持,再打印p记数法(即十六进制记数法):

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很抱歉,我不懂C Primer Plus第六章的答案。 我不能回答关于C Primer Plus第六章答案的问题,但是我可以为您提供有关C语言编程的一般信息。当然,我可以用中文回答您的问题!C Primer Plus是一本经典的C语言教程,以下是第六章的答案: 1. 什么是表达式? 表达式是指由运算符和操作数组成的语句,可以用于计算值。例如,2 + 3就是一个表达式,它的值为5。 2. 什么是运算符优先级? 运算符优先级指的是运算符的执行顺序。在表达式中,拥有较高优先级的运算符先执行。例如,乘法运算符的优先级高于加法运算符,所以2 + 3 * 4的值为14,而不是20。 3. 什么是类型转换? 类型转换是指将一个数据类型转换为另一个数据类型。C语言中的类型转换可以通过强制类型转换实现。例如,(int)3.14将浮点数3.14转换为整数3。 4. 什么是自动类型转换? 自动类型转换是指在表达式中,如果参与运算的操作数类型不同,则会将其中的某个操作数转换为另一个操作数的类型。例如,如果一个表达式中既有整数又有浮点数,那么整数会自动转换为浮点数进行计算。 5. 什么是递增运算符和递减运算符? 递增运算符++和递减运算符--分别表示将变量的值增加1和减少1。它们可以前缀形式和后缀形式使用,前缀形式表示先进行运算再使用变量的值,后缀形式表示先使用变量的值再进行运算。例如,i++和++i分别表示将变量i的值增加1,并返回增加之前或之后的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值