●常量和变量
● 常量包括:1:整形常量
2:实型常量
3:字符常量:① 普通字符 ② 转义字符
4:字符串常量
注意:单撇号内只能包含一个字符,双撇号内可以包含一个字符串
5:符号常量 :用#define 指令,指定用一个符号名称代表一个变量
注意: 区分符号常量和变量,符号常量不占内存只是一个临时符号,在预编译后这个符号就不存在了,故不能对符号常量赋以新值。为与变量名区别,习惯上符号常量用大写表示。
●变量包括:
注意:区分变量名和变量值,变量名实际上是以一个名字代表的一个存储地址。对程序编译链接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。
● 常变量:如:const int a=3; 表示a被定义为一个整形变量,指定其值为3,而且在变量存在的期间其值不能改变。
● 标识符: 用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。
注意:C语言规定标识符只能由字母、数字和下划线3种字符组成。且第一个字符必须是字母或下划线。
●数据类型:
计算机中为什么要指定变量的类型呢?
答:在数学中,数值是不分类型的,数值的运算时绝对精确的。但是在计算机中是不一样的,因为,在计算机中数据是存放在存储单元中的,它是具体存在的,不可能存放“无穷大”的数,也不能存放循环小数。所以必须指定变量的具体类型,从而有一定的有效位限制。
●整型数据:
●基本整形(int型):编译系统给int型数据分配两个字节或者4个字节(具体由编译系统自行决定),
int型在存储单元中的存储方式是:用整数的补码形式存放。对于正数,补码和原码是一样的;负数补码的求法:先求出该负数绝对值的补码,然后整体按位取反,然后加1。
注意:如果给整型变量分配了两个字节,即该整型变量所取的数值范围为:10000000 00000000 ~ 01111111 11111111;也就是说-32768 ~ 32767 。如果超出该范围则会溢出。分配4个字节同理。
●短整型(short int):系统分配短整型类型2个字节,存储方式和int型一致,即取值范围为-3276类型8 ~ 32767。
●长整型(long int ):系统分配长整型类型4个字节,存储方式和int型一致。
注意:c标准没有具体规定各种类型数据所占用存储单元的长度,这是由个编译系统自行决定的。C标准只要求Long类型数据不短于int型,short型不长于int型。
●由于实际中常常表示的情况只存在正数,没有负数情况,所以为了充分利用取值范围,可以将变量定义为“无符号”类型。即在类型前面加一个unsigned。此时由于第一位不再表示符号位,所以一般的无符号类型的取值范围是有符号类型取值范围的两倍。
注意:1:只有整形(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加。
2:对无符号整形数据用“%u”表示用无符号十进制的格式输出,有符号整形数据“%d”
3:不能对无符号变量赋值负值,否则会得到错误的结果
典型例子:unsigned short price= -1;
printf("%d\n",price);
结果会得到输出结果为65535。显然结果是错误的
具体分析:系统会将-1的补码存放进变量price当中,由于补码全部为1,另外无符号整型变量首位表示数据值,即结果为65535。
●字符型数据 :字符是按其代码(整数)形式存储的,C99把字符型数据作为整数类型的一种。
基本所有的字符的ASCII代号码都可以用7个二进制位表示,所以在C中,指定用一个字节(8位)存储一个字符(所有的系统都不例外)。此时,字节中的第一位都为0。
注意:字符‘1’ 和整数1是不同的概念,字符‘1’只代表一个形状为‘1’的符号,在需要时按照原样输出,内存中占一个字节。但是整数1内存中占2个或者4个字节。
● 实数是以指数形式存放在存储单元中的。
● float型(单精度浮点型) 系统为其分配4个字节,数值以规范化的二进制数指数形式存放在存储单元中。
注意:在4个字节中,究竟多少位表示小数位,多少位表示指数部分,C标准并没有具体规定,有编译系统自定。float型数据能得到6位有效数字。
●double型(双精度浮点型):分配8个字节。可以得到15位有效数字。
●long double型(长双精度):分配16个字节。
●C编译系统吧浮点型常量都按双精度处理,分配8个字节,一般可以在常量的末尾加专用字符,强制指定常量的类型。
●运算符++和--只能用于变量,而不能用于常量。
●printf("x1= %7.2f\nx2=%7.2f\n", x1,x2); 表示输出x1和x2,指定数据占7列,其中小数部分占2列。输出x1之后换行输出x2。并不是任何时候都需要输出6位有效位数,可以灵活控制。
printf("%5d",12); 表示指定输出数据占5列。输出的数据显示在此5列区域的右侧。
printf("%-m.nf"); 作用和没加符号一样,但是当数据长度不超过m是,数据向左靠,右端补空格。
注意:一个双精度数只能保证15位有效数字的精确度,即使指定小数位数为50,也不能保证输出的50位都是有效的数字。其他同理。
注意: 在使用getchar()函数时,键盘输入的数据先是存放在缓冲区当中,当按下ENTER键时才将前面的数据一一赋值给相应的变量。如果输入一个字符就按一下ENTER键,结果就是系统会默认的把回车符号赋给第二个变量。从而造成输出结果错误。
(未完待续)