3.2.1.常量和变量
实型常量
注意: e或E之前必须有数字,且e或E后面必须为整数。
字符常量
从其字面形式上即可识别的常量称为“字面常量”或“直接常量”。字面常量是没有名字的不变量。
符号常量
用#define
指令,指定用一个符号名称代表一个常量。
使用符号常量的好处:
注意:要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存,只是一个临时符号,代表一个值,在预编译后这个符号就不存在了,故不能对符号常量赋新值。为与变量名相区别,习惯上符号常量用大写表示,如PI,PRICE等。
常变量
可以说,常变量是有名字的不变量,而常量是没有名字的不变量。
例如:Const int a; //a的值不再改变
从使用的角度看,常变量具有符号常量的优点,而且使用更方便。有了常变量以后,可以不必多用符号常量。
标识符
C语言规定标识符只能由字母、数字和下画线3种字符组成,且第1个字符必须为字母或下画线。
注意:编译系统认为大写字母和小写字母是两个不同的字符。
3.2.2.求负整数补码的方法:
①数据的绝对值表示为二进制形式;
②最高位符号位为1,表示负数;
③除符号位外的数值取反加1。
例如:-5的补码:0101→1010→1011
3.2.3 整型数据
基本整形(int型)
Turbo C 2.0为每一个整型数据分配2个字节(16个二进位),而Visual C++为每一个整型数据分配4个字节(32位)。在存储单元中的存储方式是:用整数的补码(complement)形式存放。
求负数的补码的方法是:先将此数的绝对值写成二进制形式,然后对其所有二进位按位取反,再加1。(正数的补码是它自已。)
如果给整型变量分配2个字节(Visual C++ ),其能容纳的数值范围为
1000000000000000(即-32768)——0111111111111111(即32767)
短整型(short int)
Visual C++ 编译系统分配给短整型2个字节。范围是−32768∼32767
长整型(long int)
类型名为long int
或long
。Visual C++对一个long
型数据分配4个字节(即32位),因此long int
型变量的值的范围是−2^31∼(2^31−1),即−2147483648∼2147483647
双长整型(long long int)
类型名为long long int
或long long
,一般分配8个字节。这是C 99新增的类型,但许多C编译系统尚未实现。
C 标准没有具体规定各种类型数据所占用存储单元的长度,这是由各编译系统自行决定的。C标准只要求long
型数据长度不短于int
型,short
型不长于int
型。即
sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(longlong)
整型变量的符号属性
可以在类型符号前面加上修饰符unsigned
,表示指定该变量是“无符号整数”类型。如果加上修饰符signed
,则是“有符号类型”。如果既未指定为signed
也未指定为unsigned
的,默认为“有符号类型”。
对无符号整型数据用“%u
“格式输出。%u
表示用无符号十进制数的格式输出。
将一个变量定义为无符号整型后,不应赋予负值,否则会得到错误的结果!
3.2.4 字符型数据
字符与字符代码
ASCII代码最多用7个二进位就可以表示。所以在C语言中,指定用一个字节(8位)存储一个字符(所有系统都不例外)。此时,字节中的第1位置为0。
在使用有符号字符型变量时,允许存储的值为一128∼127128∼127,但字符的代码不可能为负值,所以在存储字符时实际上只用到0∼1270∼127这一部分,其第1位都是0。
3.2.5 浮点型数据
由于小数点位置可以浮动,所以实数的指数形式称为浮点数。
float型
小数部分占的位(bit)数愈多,数的有效数字愈多,精度也就愈高。指数部分占的位数愈多,则能表示的数值范围愈大。float
型数据能得到6位有效数字,数值范围为−3.4×10^−38∼3.4×10^38
double型
在C语言中进行浮点数的算术运算时,将float
型数据都自动转换为double
型,然后进行运算。
long double型
而Visual C++则对long double
型和double
型一样处理,分配8个字节。请读者在使用不同的编译系统时注意其差别。
3.2.6 怎样确定常量的类型
整型常量
在一个整数的末尾加大写字母L
或小写字母l
,表示它是长整型(long int
)。但在Visual C++中由于对int
和long int
型数据都分配4个字节,因此没有必要用long int
型。
浮点型常量
加字母F
或f
,就表示是float
型常量,分配4个字节。如果在实型常量后面加大写或小写的L
,则指定此常量为long double
型。
注意:要区分类型与变量。
有些读者容易弄不清类型和变量的关系,往往把它们混为一谈。应当看到它们是既有联系又有区别的两个概念。每一个变量都属于一个确定的类型,类型是变量的一个重要的属性。变量是占用存储单元的,是具体存在的实体,在其占用的存储单元中可以存放数据。而类型是变量的共性,是抽象的,不占用存储单元,不能用来存放数据。
3.3.2 基本的算术运算符
但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。多数C编译系统(如Visual C++ )采取“向零取整”的方法,取整后向零靠拢。
%
运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。
3.3.3 自增(++)、自减(—)运算符
建议谨慎使用++
和--
运算符,只用最简单的形式,即i++
,i--
。而且把它们作为单独的表达式,而不要在一个复杂的表达式中使用++
或--
运算符。
3.3.4 算术表达式和运算符的优先级与结合性
关于“结合性”的概念在其他一些高级语言中是没有的,是C语言的特点之,希望能弄清楚。
3.3.6 强制类型转换运算符
(类型名)(表达式)
注意:表达式应该用括号括起来。
需要说明的是,在强制类型转换时,得到一个所需类型的中间数据,而原来变量的类型未发生变化。
3.4.1 C语句的作用和分类
控制语句
C语言只有9种控制语句:
if()else..
(条件语句)for()...
(循环语句)while()...
(循环语句)do...while()
(循环语句)continue
(结束本次循环语句)break
(中止执行switch
或循环语句)switch
(多分支选择语句)return
(从函数返回语句)goto
(转向语句,在结构化程序中基本不用goto
语句)复合语句
注意:复合语句中最后一个语句末尾的分号不能忽略不写。
3.4.2 最基本的语句——赋值语句
复合的赋值运算符
凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。有关算术运算的复合赋值运算符有+=
,-=
,*=
,/=
,%=
。
赋值表达式
左值的意思是它可以出现在赋值运算符的左侧,它的值是可以改变的。
赋值过程中的类型转换
将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,即舍弃小数部
分,然后赋予整型变量。
将一个double
型数据赋给float
变量时,先将双精度数转换为单精度,即只取6∼76∼7位.有效数字,存储到float
型变量的4个字节中。应注意双精度数值的大小不能超出float
型变量的数值范围。
将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时,只将其低字节原封不动地送到被赋值的变量(即发生“截断”)。
整型数据之间的赋值是按存储单元中的存储形式直接传送的;
实型数据之间以及整型与实型之间的赋值是先转换(类型)再赋值的
赋值表达式和赋值语句
在if
的条件中可以包含赋值表达式,但不能包含赋值语句。
注意:要区分赋值表达式和赋值语句。
赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号。在一个表达式中可以包含一个或多个赋值表达式,但绝不能包含赋值语句。
变量赋初值
不能写成int a=b=c=3;
3.5.1 输入输出举例
printf
在使用格式声明,输出小数位小于实际小数位时按四舍五人处理。
如果输出多个数据,各占一行,而用同一个格式声明(如%7.2f
),即使输出的数据整数部分值不同,但输出时上下行必然按小数点对齐,使输出数据整齐美观。
3.5.2 有关数据输入输出的概念
C语言本身不提供输入输出语句,没有输人输出语句就可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植性好,在各种型号的计算机和不同的编译环境下都能适用,便于在各种计算机上实现。
这两种#include
指令形式的区别是:用尖括号形式(如<stdio.h>
)时,编译系统从存放C编译系统的子目录中去找所要包含的文件(如stdio.h
),这称为标准方式。如果用双撇号形式(如"stdio.h"
),在编译时,编译系统先在用户的当前目录(一般是用户存放源程序文件的子目录)中寻找要包含的文件,若找不到,再按标准方式查找。如果用#include
指令是为了使用系统库函数,因而要包含系统提供的相应头文件,这时以用标准方式为宜,以提高效率。如果用户想包含的头文件不是系统提供的相应头文件,而是用户自己编写的文件(这种文件一般都存放在用户当前目录中),这时应当用双撇号形式,否则会找不到所需的文件。
3.5.3 用printf函数输出数据
c
格式符用来输出一个字符。如果整数比较大,则把它的最后一个字节的信息以字符形式输出。
f
格式符用来输出实数(包括单、双精度、长双精度),以小数形式输出不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。系统处理的方法一般是:实数中的整数部分全部输出,小数部分输出6位。
指定数据宽度和小数位数,用%m.nf
。对其后一位采取四舍五人方法处理。如果把小数部分指定为0,则不仅不输出小数,而且小数点也不输出。
输出的数据向左对齐,用%-m.nf
。在m.n
的前面加一个负号,其作用与%m.nf
形式作用基本相同,但当数据长度不超过m
时,数据向左靠,右端补空格。如:
e
格式符。用格式声明%e
指定以指数形式输出实数。格式符e
也可以写成大写E
形式,此时输出的数据中的指数不是以小写字母e
表示而以大写字母E
表示。
i
格式符。作用与d
格式符相同,按十进制整型数据的实际长度输出。
o
格式符。以八进制整数形式输出。将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。按内存单元中实际的二进制数按3位一组构成八进制数形式,
x
格式符。以十六进制数形式输出整数。
u
格式符。用来输出无符号(unsigned
)型数据,以十进制整数形式输出。
g
格式符。用来输出浮点数,系统自动选f
格式或e
格式输出,选择其中长度较短的格式,不输出无意义的0。
除了X
,E
,G
外,其他格式字符必须用小写字母,如%d
不能写成%D
。如果想输出字符“%
”,应该在“格式控制字符串”中用连续两个“%
”表示
3.5.4 用scanf函数输入数据
*
,本输入项在读入后不赋给相应的变量
如果在格式控制字符串中除了格式声明以外还有其他字符,则在输入数据时在对应的位置上应输人与这些字符相同的字符。
在用“%c
”格式声明输人字符时,空格字符和“转义字符”中的字符都作为有效字符输入。
输入数值时,在两个数值之间需要插入空格(或其他分隔符),以使系统能区分两个数值。在连续输入字符时,在两个字符之间不要插入空格或其他分隔符。
在输人数值数据时,如输人空格、回车、Tab键或遇非法字符(不属于数值的字符),认为该数据结束。
3.5.5 字符输入输出函数
用putchar
函数既可以输出能在显示器屏幕上显示的字符,也可以输出屏幕控制字符。
getchar
函数没有参数。按Enter键后,字符才送到计算机中。
执行getchar
函数不仅可以从输入设备获得一个可显示的字符,而且可以获得在屏幕上无法显示的字符,如控制字符。