网站建设推广安徽,哈尔滨网站开发培训,企业响应网站,养殖类网站模板目录
3.1 简单变量
3.1.1 变量名
*位与字节
3.1.4 无符号类型
3.1.7 C如何确定常量的类型 C是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言#xff0c;是C语言的超集。本书是根据2003年的ISO/ANSI C标准编写的#xff0c;通过大量短…目录
3.1 简单变量
3.1.1 变量名
*位与字节
3.1.4 无符号类型
3.1.7 C如何确定常量的类型 C是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言是C语言的超集。本书是根据2003年的ISO/ANSI C标准编写的通过大量短小精悍的程序详细而全面地阐述了 C的基本概念和技术并专辟一章介绍了C11新增的功能。 《C Primer Plus第6版中文版》分18章分别介绍了C程序的运行方式、基本数据类型、复合数据类型、循环和关系表达式、分支语句和逻辑运算符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、输入/输出、C11新增功能等内容。 《C Primer Plus第6版中文版》针对C初学者从C语言基础知识开始介绍然后在此基础上详细阐述C新增的特性因此不要求读者有C语言方面的背景知识。《C Primer Plus第6版中文版》可作为高等院校教授C课程的教材也可供初学者自学C时使用。 本章内容包括 C变量的命名规则。 C内置的整型——unsigned long、long、unsigned int、int、unsigned short、 short、char、unsigned char、signed char 和 bool。 C11 新增的整型unsigned long long 和 long long。 表示各种整型的系统限制的 climits 文件。 各种整型的数字字面值常量。 使用 const 限定符来创建符号常量。 C内置的浮点类型float、double 和 long double。 表示各种浮点类型的系统限制的 cfloat 文件。 各种浮点类型的数字字面值。 C的算术运算符。 自动类型转换。 强制类型转换。 面向对象编程OOP的本质是设计并扩展自己的数据类型。设计自己的数据类型就是让类型与数据 匹配。如果正确做到了这一点将会发现以后使用数据时会容易得多。然而在创建自己的类型之前必须了解并理解 C内置的类型因为这些类型是创建自己类型的基本组件。内置的 C类型分两组基本类型和复合类型。本章将介绍基本类型即整数和浮点数。似乎只有两种类型但 C知道没有任何一种整型和浮点型能够满足所有的编程要求因此对于这两种数据它提供了多种变体。第 4 章将介绍在基本类型的基础上创建的复合类型包括数组、字符串、指针和结构。当然程序还需要一种标识存储的数据的方法本章将介绍这样一种方法—使用变量然后介绍如 何在 C中进行算术运算最后介绍 C如何将值从一种类型转换为另一种类型。3.1 简单变量
程序必须记录 3 个基本属性
信息将存储在哪里要存储什么值存储何种类型的信息
例如:
int braincount;
braincount 5;
这些语句告诉程序它正在存储整数并使用名称 braincount 来表示该整数的值这里为 5。实际上 程序将找到一块能够存储整数的内存将该内存单元标记为 braincount并将 5 复制到该内存单元中然 后您可在程序中使用 braincount 来访问该内存单元。这些语句没有告诉您这个值将存储在内存的什位置但程序确实记录了这种信息。实际上可以使用运算符来检索 braincount 的内存地址。下一章介绍另一种标识数据的方法使用指针时将介绍这个运算符。3.1.1 变量名
必须遵循几种简单的 C命名规则 在名称中只能使用字母字符、数字和下划线_。名称的第一个字符不能是数字。区分大写字符与小写字符。不能将 C关键字用作名称。
以两个下划线或下划线和大写字母打头的名称被保留给实现编译器及其使用的资源使用。以一个下划线开头的名称被保留给实现用作全局标识符。C对于名称的长度没有限制名称中所有的字符都有意义但有些平台有长度限制。C提供了一种灵活的标 准它确保了最小长度从 C 语言借鉴而来如下所示 short 至少 16 位 int 至少与 short 一样长 long 至少 32 位且至少与 int 一样长 long long 至少 64 位且至少与 long 一样长 *位与字节 计算机内存的基本单元是位bit。可以将位看作电子开关可以开也可以关。关表示值 0开表示值 1。8 位的内存块可以设置出 256 种不同的组合因为每一位都可以有两种设置所以 8 位的总组合数为 2×2×2×2×2×2×2×2即 256。因此8 位单元可以表示 0-255 或者-128 到 127。每增加一位组合数便加倍。这意味着可以把 16 位单元设置成 65 536 个不同的值把 32 位单元设置成 4 294 672 296个不同的值把 64 位单元设置为 18 446 744 073 709 551 616 个不同的值。作为比较unsigned long 存储不了地球上当前的人数和银河系的星星数而 long long 能够。 字节byte通常指的是 8 位的内存单元。从这个意义上说字节指的就是描述计算机内存量的度量单位1KB 等于 1024 字节1MB 等于 1024KB。然而C对字节的定义与此不同。C字节由至少能够容纳实现的基本字符集的相邻位组成也就是说可能取值的数目必须等于或超过字符数目。在美国基本字符集通常是 ASCII 和 EBCDIC 字符集它们都可以用 8 位来容纳所以在使用这两种字符集的系统中C字节通常包含 8 位。然而国际编程可能需要使用更大的字符集如 Unicode因此有些实现可能使用16 位甚至 32 位的字节。有些人使用术语八位组octet表示 8 位字节。 3.1.4 无符号类型
前面介绍的 4 种整型都有一种不能存储负数值的无符号变体其优点是可以增大变量能够存储的最大 值。例如如果 short 表示的范围为−32768 到32767则无符号版本的表示范围为 0-65535。当然仅当数值不会为负时才应使用无符号类型如人口、粒数等。要创建无符号版本的基本整型只需使用关键字 unsigned 来修改声明即可整型溢出 该程序将一个 short 变量sam和一个 unsigned short 变量sue分别设置为最大的 short 值在我们的系统上是 32767。然后将这些变量的值都加 1。这对于 sue 来说没有什么问题因为新值仍比无符号整数的最大值小得多但 sam 的值从 32767 变成了−32768同样对于 sam将其设置为 0 并减去 1也不会有问题但对于无符号变量 sue将其设置为 0 并减去后它变成了 65535。可以看出这些整型变量的行为就像里程表。如果超越了限制其值将为范围另一端的取值参见图 3.1。C确保了无符号类型的这种行为但 C并不保证符号整型超越限制上溢和下溢时不出错而这正是当前实现中最为常见的行为。3.1.7 C如何确定常量的类型
程序的声明将特定的整型变量的类型告诉了 C编译器但编译器是如何知道常量的类型呢假设在程序中使用常量表示一个数字程序将把 1492 存储为 int、long 还是其他整型呢答案是除非有理由存储为其他类型如使用了特殊的后缀来表示特定的类型或者值太大不能存储为 int否则 C将整型常量存储为 int类型。首先来看看后缀。后缀是放在数字常量后面的字母用于表示类型。整数后面的 l 或 L 后缀表示该整 数为 long 常量u 或 U 后缀表示 unsigned int 常量ul可以采用任何一种顺序大写小写均可表示 unsigned long 常量由于小写 l 看上去像 1因此应使用大写 L 作后缀。例如在 int 为 16 位、long 为 32 位的系统上数字 22022 被存储为 int占 16 位数字 22022L 被存储为 long占 32 位。同样22022LU 和 22022UL都被存储为 unsigned long。C11 提供了用于表示类型 long long 的后缀 ll 和 LL还提供了用于表示类型 unsigned long long 的后缀 ull、Ull、uLL 和 ULL。接下来考察长度。在 C中对十进制整数采用的规则与十六进制和八进制稍微有些不同。对于不带后缀的十进制整数将使用下面几种类型中能够存储该数的最小类型来表示int、long 或 long long。在 int 为 16 位、long 为 32 位的计算机系统上20000 被表示为 int 类型40000 被表示为 long 类型3000000000 被表示为 long long 类型。对于不带后缀的十六进制或八进制整数将使用下面几种类型中能够存储该数的最小类型来表示int、unsigned int long、unsigned long、long long 或 unsigned long long。在将 40000 表示为 long 的计算机系统中十六进制数 0x9C4040000将被表示为 unsigned int。这是因为十六进制常用来表示内存地址而内存地址是没有符号的因此usigned int 比 long 更适合用来表示 16 位的地址。3.3.1 书写浮点数
C有两种书写浮点数的方式。第一种是使用常用的标准小数点表示法即使小数部分为 0如 8.0小数点也将确保该数字以浮点格式而不是整数格式表示。C标准允许实现表示不同的区域例如提供了使用欧洲方法的机制即将逗号而不是句点用作小数点。然而这些选项控制的是数字在输入和输出中的外观而不是数字在代码中的外观。第二种表示浮点值的方法叫做 E 表示法其外观是像这样的3.45E6这指的是 3.45 与 1000000 相乘的结果E6 指的是 10 的 6 次方即 1 后面 6 个 0。因此3.45E6 表示的是 34500006 被称为指数3.45 被称为尾数。下面是一些例子 E 表示法确保数字以浮点格式存储即使没有小数点。注意既可以使用 E 也可以使用 e指数可以是正数也可以是负数。参见图 3.3。然而数字中不能有空格因此 7.2 E6 是非法的。指数为负数意味着除以 10 的乘方而不是乘以 10 的乘方。因此8.33E4 表示 8.33/104 即 0.000833。 同样电子质量 9.11e31 kg表示 0.000000000000000000000000000000911 kg。可以按照自己喜欢的方式表示数字911 在美国是报警电话而电话信息通过电子传输这是巧合还是科学阴谋呢读者可以自己作出评判。注意−8.33E4 指的是−83300。前面的符号用于数值而指数的符号用于缩放。记住d.dddEn 指的是将小数点向右移 n 位而 d.dddEn 指的是将小数点向左移 n 位。之所以称为“浮点”就是因为小数点可移动。3.5 总结 C的基本类型分为两组一组由存储为整数的值组成另一组由存储为浮点格式的值组成。整型之间通过存储值时使用的内存量及有无符号来区分。整型从最小到最大依次是bool、char、signed char、unsigned char、short、unsigned short、int、unsigned int、long、unsigned long 以及 C11 新增的 long long和 unsigned long long。还有一种 wchar_t 类型它在这个序列中的位置取决于实现。C11 新增了类型 char16_t 和 char32_t它们的宽度足以分别存储 16 和 32 位的字符编码。C确保了 char 足够大能够存储系统基本字符集中的任何成员而 wchar_t 则可以存储系统扩展字符集中的任意成员short 至少为 16位而 int 至少与 short 一样长long 至少为 32 位且至少和 int 一样长。确切的长度取决于实现。字符通过其数值编码来表示。I/O 系统决定了编码是被解释为字符还是数字。浮点类型可以表示小数值以及比整型能够表示的值大得多的值。3 种浮点类型分别是 float、double 和long double。C确保 float 不比 double 长而 double 不比 long double 长。通常float 使用 32 位内存double 使用 64 位long double 使用 80 到 128 位。通过提供各种长度不同、有符号或无符号的类型C使程序员能够根据特定的数据要求选择合适的 类型。C使用运算符来提供对数字类型的算术运算加、减、乘、除和求模。当两个运算符对同一个操作数进行操作时C的优先级和结合性规则可以确定先执行哪种操作。 对变量赋值、在运算中使用不同类型、使用强制类型转换时C将把值从一种类型转换为另一种类型。很多类型转换都是“安全的”即可以在不损失和改变数据的情况下完成转换。例如可以把 int 值转换为 long 值而不会出现任何问题。对于其他一些转换如将浮点类型转换为整型则需要更加小心。开始读者可能觉得大量的 C基本类型有些多余尤其是考虑到各种转换规则时。但是很可能最终将发现某些时候只有一种类型是需要的此时您将感谢 C提供了这种类型。3.6 复习题
1为什么 C有多种整型2声明与下述描述相符的变量。ashort 整数值为 80bunsigned int 整数值为 42110c值为 3000000000 的整数3C提供了什么措施来防止超出整型的范围433L 与 33 之间有什么区别5下面两条 C语句是否等价6如何使用 C来找出编码 88 表示的字符指出至少两种方法。7将 long 值赋给 float 变量会导致舍入误差将 long 值赋给 double 变量呢将 long long 值赋给 double 变量呢8下列 C表达式的结果分别是多少9假设 x1 和 x2 是两个 double 变量您要将它们作为整数相加再将结果赋给一个整型变量。请编写一条完成这项任务的 C语句。如果要将它们作为 double 值相加并转换为 int 呢10下面每条语句声明的变量都是什么类型3.7 编程练习
1编写一个小程序要求用户使用一个整数指出自己的身高单位为英寸然后将身高转换为英尺和英寸。该程序使用下划线字符来指示输入位置。另外使用一个 const 符号常量来表示转换因子。2编写一个小程序要求以几英尺几英寸的方式输入其身高并以磅为单位输入其体重。使用 3 个变量来存储这些信息。该程序报告其 BMIBody Mass Index体重指数。为了计算 BMI该程序以英寸 的方式指出用户的身高1 英尺为 12 英寸并将以英寸为单位的身高转换为以米为单位的身高1 英寸 0.0254 米。然后将以磅为单位的体重转换为以千克为单位的体重1 千克2.2 磅。最后计算相应的BMI—体重千克除以身高米的平方。用符号常量表示各种转换因子。3编写一个程序要求用户以度、分、秒的方式输入一个纬度然后以度为单位显示该纬度。1 度为 60 分1 分等于 60 秒请以符号常量的方式表示这些值。对于每个输入值应使用一个独立的变量存储它。下面是该程序运行时的情况4编写一个程序要求用户以整数方式输入秒数使用 long 或 long long 变量存储然后以天、小时、分钟和秒的方式显示这段时间。使用符号常量来表示每天有多少小时、每小时有多少分钟以及每分钟 有多少秒。该程序的输出应与下面类似5编写一个程序要求用户输入全球当前的人口和美国当前的人口或其他国家的人口。将这些信息存储在 long long 变量中并让程序显示美国或其他国家的人口占全球人口的百分比。该程序的输出应与下面类似6编写一个程序要求用户输入驱车里程英里和使用汽油量加仑然后指出汽车耗油量为一 加仑的里程。如果愿意也可以让程序要求用户以公里为单位输入距离并以升为单位输入汽油量然后 指出欧洲风格的结果—即每 100 公里的耗油量升。7编写一个程序要求用户按欧洲风格输入汽车的耗油量每 100 公里消耗的汽油量升然后将其转换为美国风格的耗油量—每加仑多少英里。注意除了使用不同的单位计量外美国方法距离/燃料与欧洲方法燃料/距离相反。100 公里等于 62.14 英里1 加仑等于 3.875 升。因此19mpg 大约 合 12.4l/100kml27mpg 大约合 8.71/100km。