第三章 数据和C

3.1 示例程序

本章仍以示例程序开始。如果发现有不熟悉的地方,没关系,我们稍后会详细介绍。

#include <stdio.h>

int main(int argc, const char * argv[]) {
    float weight; /* 你的体重 */
    float value; /* 相等重量的白金价值 */

    printf("Are you worth your weight in platinum?\n");
    printf("Let's check it out.\n");
    printf("Please enter your weight in pounds: ");
    /* 获取用户的输入 */
    scanf("%f", &weight);
    /* 假设白金的价格是每盎司$1700 */
    /* 14.5833 用于把英镑常衡盎司转换为金衡盎司 */
    value = 1700.0 * weight *14.5833;
    printf("Your weight in platinum is worth $%.2f.\n", value);
    printf("You are easily worth that! aif platinum prices drop,\n");
    printf("eat more to maintain your value.\n");

    return 0;
}

注意:“enter your weight“ 的意思是让你输入完体重后,按下ENTERRETURN键。按下ENTER键是告知计算机,你已经完成输入数据。该程序需要你输入一个数字,而不是单词。如果输入字母而不是数字,会导致程序出问题。下面是程序的输出示例:
Are you worth your weight in platinum?
Let’s check it out.
Please enter your weight in pounds: 156
Your weight in platinum is worth $3867491.25.
You are easily worth that! aif platinum prices drop,
eat more to maintain your value.

3.1.1 程序中的新元素

  • 注意,代码中使用了一种新的变量声明。浮点数类型(float)变量。
  • 为了打印新类型的变量,在 printf() 中使用 %f 来处理浮点值。%.2f 中的 .2 用于精确控制输出,指定输出的浮点数只显示小数点后面两位。
  • scanf() 函数用于读取键盘的输入。%f 说明 scanf() 要读取用户从键盘输入的浮点数,&weight 告诉 scanf() 把输入的值赋给名为 weight 的变量。scanf() 函数使用 & 符号表明找到 weight 变量的地点(内存地址)。
  • 本程序最突出的新特点是它的交互性。计算机向用户询问信息,然后用户输入数字。与非交互式程序相比,交互式程序用起来更有趣。更重要的是,交互式使得程序更加灵活。

3.2 变量与常量数据

在程序的指导下,计算机可以做许多事情。要完成这些任务,程序需要使用数据,即承载信息的数字和字符。有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些称为常量(constant)。其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量(variable)

3.3 数据:数据类型关键字

不仅变量和常量不同,不同的数据类型之间也有差异。一些数据类型表示数字,一些数据类型表示字母(更普遍地说是字符)。
在C语言中,用 int 关键字来表示基本的整数类型。char 类型也可以表示较小的整数。float、double 和 long double 表示带小数点的数。_Bool 类型表示布尔值(true 和 false),_Complex 和 _Imageinary 分别表示复数和虚数。

位、字节和字

位、字节和字是描述计算机数据单元或存储单元的术语。这里主要指存储单元。
最小的存储单元是位(bit),可以储存 0 或 1(或者说,位用于设置“开“或“关“)。虽然 1 位储存的信息有限,但是计算机中位的数量十分庞大。位是计算机内存的基本构建块。
字节(byte)是常用的计算机存储单位。对于几乎所有的机器,1 字节均为 8 位。这是字节的标准定义,至少在衡量存储单位时是这样。既然 1 位可以表示 0 或 1,那么 8 位字节就有 256 种可能的 0、1 的组合。通过二进制编码,便可表示 0~255 的整数或一组字符。
字(word)是设计计算机时给定的自然存储单位。对于 8 位的微型计算机,1 个字长只有 8 位。从那之后,个人计算机字长增至 16 位、32位,直到目前的64位。计算机的字长越大,其数据转移越快,允许的内存访问也更多。

3.3.1 整数

和数学一样,整数是没有小数部分的数。计算机以二进制数字储存整数。

3.3.2 浮点数

浮点数与数学中的实数差不多。注意,在一个值后面加上一个小数点,该值就成为一个浮点值。所以,7 是整数,7.00 是浮点数。显然,书写浮点数有多种形式。
这里关键有理解浮点数和整数的储存方案不同。计算机把浮点数分成小数部分和指数部分来表示,而且分开储存这两部分。因此,虽然 7.00 和 7 在数值上相同,但是它们的储存方式不同。在十进制下,可以把 7.0写成0.7E1。这里,0.7 是小数部分,1 是指数部分。现在,我们着重讲解这两种类型的实际区别。
* 整数没有小数部分,浮点数有小数部分。
* 浮点数可以表示的范围比整数大。
* 对于一些算术运算(如,两个很大的数相减),浮点数损失的精度更多。
* 浮点数通常只是实际值的近似值。例如,7.0 可能被储存为浮点值 6.9999。
* 过去,浮点运算比整数运算慢。不过,现在许多CPU都包含浮点处理器,缩小来速度上的差距。

3.4 C语言基本数据类型

3.4.1 int 类型

int 类型是有符号整型,即 int 类型的值必须是整数,可以是正整数、负整数或零。

1、声明 int 变量

int erns;
int hogs, cows, goats;

2、初始化变量
初始化(initialize) 变量就是为变量赋一个初始值。

int hogs = 21;
int cows = 32, goats = 14;
int dogs, cats = 94; /* 有效,但是这种格式很糟糕 */

3、int 类型常量
上面示例中出现的整数(21、32、14和94)都是整型常量或整型字面量。C语言把不含小数点和指数的数作为整数。

4、打印 int 值
可以使用 printf() 函数打印 int 类型的值。%d 指明了在一行中打印整数的位置。%d 称为转换说明,它指定了 printf() 应使用什么格式来显示一个值。格式化字符中的每个 %d 都与待打印变量列表中相应的 int 值匹配。这个值可以是 int 类型的变量、int 类型的常量或其他任何值为 int 类型的表达式。作为程序员,要确保转换说明的数量与待打印值的数量相同,编译器不会捕捉这类型的错误。

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int ten = 10;
    int two = 2;

    printf("Doing it right: ");
    printf("%d minus %d is %d\n", ten, 2, ten - two);
    printf("Doing it wrong: ");
    printf("%d minus %d is %d\n", ten); // 遗漏 2 个参数

    return 0;
}

编译并运行该程序,输出如下:
Doing it right: 10 minus 2 is 8
Doing it wrong: 10 minus 1027 is -11861900
在第一行输出中,第1个 %d 对应 int 类型变量 ten;第2个 %d 对应 int 类型常量2;第3个 %d 对应 int 类型表达式 ten - two 的值。在第二行输出中,第1个 %d 对应 ten 的值,但是由于没有给后两个 %d 提供任何值,所以打印出的值是内存中的任意值。

5、八进制和十六进制
通常,C语言都假定整型常量是十进制。然而,许多程序员很喜欢使用八进制和十六进制数。因为 8 和 16 都是 2 的幂,而 10 却不是。显然,八进制和十六进制记数系统在表达与计算机相关的值时很方便。例如,十进制数 65536 用十六进制表示正好是 10000。另外,十六进制数的每一位的数恰好由 4 位二进制数表示。例如,十六进制数 3 是 0011,十六进制数 5 是 0101。因此,十六进制数 35 的位组合(bit pattern)是 00110101,十六进制数 53 的位组合是 01010011。这种对应关系使得十六进制和二进制的转换非常方便。在C语言中,用特定的前缀表示使用哪种进制。0x 或 0X 前缀表示十六进制值,所以十进制数 16 表示成十六进制是 0x10 或 0X10。与此类似, 0 前缀表示八进制。例如,十进制数 16 表示成八进制是 020。
要清楚,使用不同的进制数是为了方便,不会影响数被储存的方式。因为计算机内部都以二进制进行编码。

6、显示八进制和十六进制

猜你喜欢

转载自blog.csdn.net/KaraShok/article/details/80428049
今日推荐