第 3 章 数据和C

3.1示例程序

/*用GOLD衡量我的体重*/
#include <stdio.h>
int main(void)
{
	float weight;    /*体重kg*/
	float value;     /*同等质量黄金的价格*/
	printf("Hello,Mr.Gold.Are you worth your weight in gold?\n");
	printf("Let's check it out.\n");
	printf("Please enter your weight in kg: \n");
	scanf_s("%f", &weight);         /*从用户处获取输入*/
	value = 270.0 * weight * 1000;  /*假设黄金¥270/g*/
	printf("Your weight in gold is worth ¥%.2f.\n", value);
	return 0;
}

此程序中包含C语言的一些新元素:

  •  

一、计算机中的内存

   计算机存储的基本单位是位(bit),每一位可以存储一个二进制数(0或1);每8个位称为一个字节(byte),每个字节由一个数字标记,这种标记叫做地址,字节的地址可以唯一地引用计算机内存中的特定字节。

   内存常用千字节(KB)、兆字节(MB)甚至千兆字节(GB)表示:1千字节(1KB)=1024字节、1兆字节(1MB)=1024千字节(KB)、1千兆字节(1GB)=1024兆字节(MB)。

第 3 章 数据和C

二、常量

   在程序执行过程中,其值不发生改变的量称为常量。常量分为直接常量和符号常量。

   直接常量是指可以立即拿来用,无需任何说明的量,如整型常量12、实型常量6.13、字符常量‘a’。

   符号常量是指用标识符来表示常量,符号常量在使用之前必须先定义。常量一般全用大写字母命名,用下划线分割单词。定义常量有三种方式:

#define PI 3.14         /*PI只是3.1415926的别名,在编译期间用3.1415926去取代Pi的值*/
const float PI = 3.14;  /*将PI定义成变量,但告诉编译器它的值是固定不变的,若在程序中试图去修改PI值,编译时会报错*/
enum Sex{MALE,FEMALE}   /*枚举常量,值是从0开始递增,即MALE=0,FEMALE=1*/

三、变量

   变量是一段特定的计算机内存,有一个或多个连续的字节构成。变量的三个要素为:变量名、变量类型、变量的值。每个变量有一个名字,可以用变量名引用这段内存,读取它存放的数据,或在此存放一个新数据值。变量的类型有多种,每种类型用于存储一种特定的数据。

1.整型变量

   C提供多种整数类型。C把不含小数点和指数的数当作整数,如22和-13是整数,而22.0和1.3E1则不是。

1.1声明int类型变量

int age;                   /*声明一个变量*/
int apple,pen,pinapple;    /*同时声明多个变量*/

1.2初始化变量 :为变量赋一个初始值

age = 20;          /*直接赋值*/
scanf(%d,&age);    /*使用scanf()函数为程序提供键盘输入,%d指示scanf()从键盘读取一个整数,
                     &age指定将输入值赋于名为age的变量中,&符号指示age变量的位置*/
scanf("%d %d %d",&apple,&pen,&pineapple);
                    
int age = 20;      /*在声明语句中初始化变量*/
int apple = 1,pen = 2,pineapple = 3;

1.3打印int值 

printf("%d\n",age);    /*printf()函数有两个参数,它们之间由逗号分隔;
                         参数1是控制字符串,它控制如何显示由后面的参数指定的输出;
                         参数2是变量age;
                         %d称为格式说明符,它指示printf()应使用什么格式来显示一个数值*/
printf("apple = %d,pen = %d,pineapple = %d\n",apple,pen,pineapple)
                        /*必须确保格式说明符的数目同参数2中变量数目相同*/

1.4八进制和十六进制

   在C中,允许使用3中数制书写数字:十进制、八进制、十六进制,并由专门的前缀指明哪一种进制。前缀0表示使用八进制值,十进制数16用八进制表示为020。前缀0x或0X表示使用十六进制值,则十进制数16用十六进制表示为0x10或0X10。

   在C中,也允许以这三种数制显示数字,并由专门的格式说明符指明哪一种数制。%o表示用八进制显示整数,%x表示用十六进制显示整数。若想显示C语言前缀,可以使用说明符%#o、%#x、%#X分别生成0、0x、0X前缀。

#include <stdio.h>
int main(void)
{
    int age=20;

    printf("dec = %d,octal = %o,hex = %x\n",age,age,age);    /*分别以十进制、八进制、十六进制显示十进制数20*/
    printf("dec = %d,octal = %#o,hex = %#x\n",age,age,age);  /*分别以十进制、八进制、十六进制显示十进制数20,并显示C语言前缀*/
    return 0;
}

编译并运行上面的程序,将产生下列输出:

dec = 20,octal = 24,hex = 14
dec = 20,octal = 024,hex = 0x14 

1.5其他整数类型

   C提供3个附属关键字修饰基本的整数类型:short、long、unsigned。

   1.5.1声明其他整数类型

short int apple;         short apple;           /*两条指令等价*/
long int apple;          long apple;            /*两条指令等价*/
unsigned int apple;      unsigned apple;        /*两条指令等价*/
unsigned long int apple; unsigned long apple;   /*两条指令等价*/
long long int apple;     long long apple;       /*两条指令等价*/
/*signed可以和任何有符号类型一起使用,它使数据的类型更加明确,以下四条指令等价*/
short int apple;short apple;signed short int apple;signed short apple;

   1.5.2long常量和long long常量

   若希望把一个较小的常量作为long类型对待,可以使用字母L(或l)后缀,比如20L;类似地,在支持long long类型的系统中,可以使用ll或LL后缀标识long long类型值,比如3LL;u或U后缀用于标识unsigned long long类型值,比如5ull、10LLU、9Ull。   

2.实型变量

2.1声明浮点变量

float altitude;
double height;
long double distance;

2.2浮点常量

   一个浮点常量最基本的形式是:包含小数点的一个带符号的数字序列,接着是字母e或E,然后是代表10的指数的一个有符号值。如-6.18e2、1.3e-3。可以省略正号。可以没有小数点(3E5)或指数部分(3.14),但不能同时没有二者。可以省略纯小数部分(3.E5)或整数部分(.14E-5),但不能同时没有二者。

float altitude;
altitude = 2.0 * 4.0;

   默认情况下,编译器会将浮点常量当作double类型,(通常)使用64位进行储存。乘积运算使用双精度结果被截为正常的float长度,这能保证计算精度,但会减慢程序的执行。通过F(或f)后缀可使编译器把浮点常量当作float类型,比如2.3f,3.1415F。通过L(或l)后缀可使浮点常量为long double类型,比如3.14L。

2.3打印浮点值

float weight = 65.5f; 
printf("%f\n",converged);

3.字符变量

   char类型用于存储字母和标点符号子类的字符。

3.1声明char类型变量

char table;         /*声明一个变量*/
char desk,chair;    /*同时声明多个变量*/

3.2字符常量及其初始化

char grade = 'a';          /*声明变量grade赋字符A*/

   单引号中的一个字符是C的一个字符常量,编译器遇到‘a’时会将其转化为相应的编码值,其中单引号是必不可少的。

char converged;
converged = 'T';        /*可以*/
converged = T;          /*不可以!把T看作一个变量*/
converged = "T";        /*不可以!把"T"看作一个字符串*/

3.3打印字符 

char converged = 'T'; 
printf("%c\n",converged);