赞
踩
在程序运行过程中,其值不能被改变的量,称为常量。数值常量就是数学中的常数。
整数,如1000、1234、0、-345等都是整型常量。
十进制小数形式,由数字和小数点组成。如123.456、0.123、-12.32、0.0等。
指数形式。如12.34e3代表12.34*10**3,规定以字母e或E代表以10为底的指数,e或E之前必须有数字,且后面必须为整数。
普通字符
用单撇号括起来的一个字符,如'a','b','C','3','?','#'。不能写成"ab"或"12"。单撇号只是界限符,字符常量只能是一个字符,不包括单撇号,'a'和'A'是不同的字符常量。字符常量存储在计算机存储单元中时,并不是存储字符本身,而是以其代码ASCII代码存储的。
以字符“\”开头的字符序列。
在printf函数中的“\n”代表一个换行符,“\t”代表将输出的位置跳到下一个Tab(制表)位置,一个Tab位置为8列。
这是一种在屏幕上无法显示的“控制字符”,在程序中也无法用一个一般形式的字符来表示,只能采用这样的特殊形式来表示。
转义字符将“\”后面的字符转换为另外的意义。
如“boy”,“123”等,用双撇号把若干字符括起来,字符串常量是双撇号中的全部字符,但不包括双撇号本身,单撇号内只能包含一个字符,双撇号内可以包含一个字符串。
用#define指令,指定一个符号名称代表一个常量。
经过指定后,本文件中从此行开始所有的PI都代表3.1416,用一个符号名代表一个常量的,称为符号常量。
好处:
含义清楚
在需要改变程序中多处用到的同一个常量时,能做到一改全改。
符号常量不占用内存,只是一个临时符号,代表一个值,在预编译后这个符号就不存在了,不能对符号常量赋新值,为与变量相区别,常量习惯上用大写表示,PI等。
先定义、后使用。
变量代表一个有名字的、具有特定属性的一个存储单元。在运行期间值可以改变。
在定义时指定该变量的名字和类型,一个变量应该有一个名字,以便引用。
在定义常变量时,前面添加关键字const,如
定义d为一个整型变量,指定其值为9,在变量存在期间其值不能改变。
常变量是有名字的不变量,而常量是没有名字的不变量,有名字就便于在程序中被引用;
定义符号常量用#define指令,它是预编译指令,它只是用符号常量代表一个字符串,在预编译时仅进行字符替换,在预编译后,符号常量就不存在了,对符号常量的名字是不分配存储单元的。变量要占用存储单元,有变量值,只是该值不改变而已;常变量具有符号常量的优点,而且使用更方便。有了常变量以后,可以不必多用符号常量。
用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列,统称为标识符。简单来说,标识符就是一个对象的名字。
在定义变量时需要指定变量的类型,不同的类型分配不同的长度和存储形式。
在存放整数的存储单元中,最左面一位是用来表示符号的,如果该位为0,表示数值为正,如果该位为1,表示数值为负。
编译系统分配给int型数据2个或4个字节,由具体的C编译系统自行决定;在存储单元中的存储方式:用整数的补码形式存放,一个整数的补码是此数的二进制形式,例如5的二进制形式是101;求负数的补码方法是:先将此数的绝对值写成二进制形式,然后对其所有二进制位按位取反,再加1。
其能容纳的数值范围为:-21474833648 ~ 2147483647 .
存储方式与int型相同,一个短整型变量的值的范围是: -32768 ~ 32767 .
类型名为long int 或 long。VS C++对一个long型数据分配4个字节(32位),因此long int型变量的值的范围是: -2147483648 ~ 2147483647 .
类型名为long long int 或 long long ,一般分配8个字节。sizeof是测量类型或变量长度的运算符。
变量值在存储单元中都是以补码形式存储的,存储单元中的第1个二进制位代表符号,整型变量的值的范围包括负数到正数。
为了充分利用变量的值的范围,可以将变量定义为“无符号”类型,在类型符号前面加上修饰符unsigned,表示指定该变量是“无符号整数”类型;如果加上修饰符signed,则是“有符号类型”。
有符号整型数据存储单元中最高位代表数值的符号(0为正,1为负)。如果指定unsigned(为无符号)型,存储单元中全部二进制位(b)都用作存放数值本身,而没有符号。无符号类型变量只能存放不带符号的整数,如123,3454等,而不能存放负数,无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。
有符号基本整型 | [signed] | int | ||
无符号基本整型 | unsigned | int | ||
有符号短整型 | [signed] | short | [int] | |
无符号短整型 | unsigned | short | [int] | |
有符号长整型 | [signed] | long | [int] | |
无符号长整型 | unsigned | long | [int] | |
有符号双长整型 | [signed] | long | long | [int] |
无符号双长整型 | unsigned | long | long | [int] |
只有整型数据可以加unsigned或signed修饰符,实型数据不能加。
对无符号整型数据用“%u”格式输出,%u表示用无符号十进制数的格式输出。
字符是按其代码形式存储的
字符与字符代码并不是任意写一个字符,程序都能识别的,只能使用系统的字符集中的字符,目前大多数系统采用ASCII字符集,各种字符集的基本集都包括了127个字符。
所以在c语言中,指定用一个字节(8位)存储一个字符。
字符变量是用类型符char定义字符变量,可以把0~127之间的整数赋给一个字符变量,字符变量也可以使用unsigned或signed修饰符。
浮点型数据是用来表示具有小数点的实数的,在c语言中,实数是以指数形式存放在存储单元中的,由于小数点的位置可以浮动,所以实数的指数形式称为浮点数
编译系统为每个float型变量分配4个字节,数值以规范化的二进制数指数形式存放在存储单元中,在存储时,系统将实现数据分成小数部分和指数部分两个部分,分别存放,小数部分的小数点前面的数为0.
为了扩大能表示数值范围,用8个字节存储一个double型数据,可以得到15位有效数字;
为了提高运算精度,在c语言中进行浮点数的算术运算时,将float型数据都自动转换为double型,然后进行运算。
不同的编译系统对long double型处理方法不同,用有限的存储单元不可能完全精确的存储一个实数。
类型 | 字节数 | 有效数字 |
float | 4 | 6 |
double | 8 | 15 |
long double | 8 | 15 |
long double | 16 | 19 |
不带小数点的数值是整型常量,但应注意其有效范围。
在一个整数末尾加大写字母L或小写字母l,表示它是长整型(long int),例如123L,1334l等。
凡以小数形式或指数形式出现的实数均是浮点型常量,在内存中都以指数形式存储。
C编译系统把浮点型常量都按双精度处理,分配8个字节,C程序中的实型常量都作为双精度浮点型常量。
可以在常量的末尾加专用字符,强制指定常量的类型,如float a=3.48733f;
几乎每一个程序都需要进行运算,对数据进行加工处理,否则程序就没有意义了,要进行运算,就需规定可以使用的运算符。
算术运算符 (+ - * / % ++ --)
关系运算符 (> < == >= <= !=)
逻辑运算符 (!&& ||)
位运算符 (<< >> ~ | ^ &)
赋值运算符 (=及其扩展赋值运算符)
条件运算符 (?:)
逗号运算符 (,)
指针运算符 (*和&)
求字节数运算符 (sizeof)
强制类型转换运算符 ((类型))
成员运算符 (. ->)
下标运算符 ( [ ] )
其他 (如函数调用运算符())
运算符 | 含义 | 举例 | 结果 |
+ | 正号运算符(单目运算符) | +a | a的值 |
- | 负号运算符(单目运算符) | -a | a的算术负值 |
* | 乘法运算符 | a*b | a和b的乘积 |
/ | 除法运算符 | a/b | a除以b的商 |
% | 求余运算符 | a%b | a除以b的余数 |
+ | 加法运算符 | a+b | a和b的和 |
- | 减法运算符 | a-b | a和b的差 |
两个实数相除的结果是双精度实数,两个整数相除的结果为整数,如5/3,舍去小数部分;
如果相除或被除数中有一个为负值,则舍入的方向是不固定的。%运算符要求参加运算的运算对象(即操作数)为整数,结果也为整数。
++i, --i (在使用i之前,先使i的值加(减)1)
i++, i-- (在使用i之后,使i的值加(减)1)
自增(减)运算符常用于循环语句中,使循环变量自动加1,也用于指针变量,使指针变量指向下一个地址。
用算术运算符和括号将运算对象(操作数)连接起来的、符合C语法规则的式子称为C算术表达式。
C语言规定了运算符的优先级(如先乘除再加减),还规定了运算符的结合性。
在表达式求值时,先按运算符的优先级别顺序执行,乘号优先于减号,如果在一个运算对象两侧的运算级别相同,则按规定“结合方向”处理;C语言还规定了各种运算符的结合方式(结合性),算术运算符的结合方向都是“自左向右”,又称左结合;有些运算符的结合方向是“自右向左”(赋值运算符),又称右结合,这是C语言的特点之一。
如果一个运算符两侧的数据类型不同,则先自动进行类型转换,使二者成为同一类型,然后进行运算。
整数、实型、字符型数据间可以进行混合运算。其规律为:
+ 、- 、* 、/ 运算的两个数中有一个为float或double型,结果使double型。
如果int型与float型或double型数据进行运算,结果使double型。
字符(char)型数据与整型数据进行算术运算,把字符的ASCII代码与整型数据进行运算,如果字符型数据与整型数据进行运算,则将字符型的ASCII代码转换为double型数据,然后进行运算。
同一个字母,用小写表示字符的ASCII代码比用大写表示的字符ASCII代码大32。
一个字符数据既可以以字符形式输出(%c),也可以以整数形式输出(%d)。
可以利用强制类型转换运算符将一个表达式转换成所需类型。
(double)a (将a转换成double型)
(int) (x+y) (将x+y的值转换成int型)
(float)(5%3) (将5%3的值转换成float型)
其一般形式为:
(类型名)(表达式)
表达式应该用括号括起来
强制类型转换运算优先于%运算,当自动类型转换不能实现目的时可以用强制类型转换。
一个函数包含声明部分和执行部分,执行部分是由语句组成的,语句的作用是向计算机系统发出指令;声明部分不是语句,它不产生机器指令,只是对有关数据的声明。
C语句分为以下5类:
if()...else... (条件语句)
for()... (循环语句)
while()... (循环语句)
do...while() (循环语句)
continue (结束本次循环语句)
break (中止执行switch或循环语句)
switch (多分枝选择语句)
return (从函数返回语句)
goto (转向语句,在结构化程序中基本不用goto语句)
()表示括号中是一个“判别条件”,“...”表示内嵌的语句。
如:if(x>y) z=x; else z=y;
由一个函数调用加上一个分号构成,如:printf("This is a C statement.");
由一个表达式加上一个分号构成,最经典的就是赋值表达式构成一个赋值语句。
如
a=3
是赋值表达式;
a=3;
是赋值语句。
一个表达式的最后加一个分号就成了语句,一个语句必须在最后有一个分号,分号是语句不可缺少的组成部分,而不是两个语句间的分隔符号,任何表达式都可以加上分号而成为语句。
表达式能构成语句是C语言的一个重要特色,“函数调用语句”也属于表达式语句,因为函数调用也属于表达式的一种。
下面是一个空语句:
;
可以用来作为流程的转向点(流程从程序其他地方转到此语句处),也可以用来作为循环语句中的循环体(循环体是空语句,表示循环体什么也不做)。
用{ }把一些语句和声明括起来成为复合语句(又称语句块);
可以在复合语句中包含声明部分,复合语句常用在if语句或循环中,此时程序需要连续执行一组语句;
复合语句中最后一个语句末尾的分号不能忽略不写。
最常用的语句是:赋值语句和输入输出语句;最基本的是赋值语句。
sqrt函数是求平方根的函数,由于要调用数学函数中的函数,必须在程序的开头加一条#include指令,把头文件“math.h”包含到程序中来。
常用“\t”来调整输出的位置,使输出的数据清晰、整齐、美观。在程序中要用到数学函数库中的函数,都应当在文本的开头包含math.h头文件。
赋值符号“=”就是赋值运算符,作用是将一个数据赋给一个变量,也可以将一个表达式赋给一个变量。
在赋值符号“=”之前加上其他运算符可以构成复合运算符。
例如:
a+=3 等价于 a=a+3
x*=y+8 等价于 x=x*(y+8)
x%=3 等价于 x=x%3
a+=b
如果b是包含若干项的表达式,则相当于它有括号。
C语言采用这种复合运算符为了:
简化程序,使程序简练
提高编译效率,能产生高质量的代码
由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。
赋值表达式的作用是:
将一个表达式的值赋给一个变量,具有计算和赋值的双重功能。
赋值表达式的求解过程是:
先求赋值运算符右侧的“表达式”的值,然后赋给赋值运算符左侧的变量;表达式的值等于赋值后左侧变量的值。
一般形式为:
变量 赋值运算符 表达式
赋值运算符左侧应该是一个可修改值的“左值”,左值应当为存储空间并可以赋值,变量可以做左值也可以做右值,能出现在赋值运算符右侧的表达式称为“右值”,凡是左值都可以作右值。
如果赋值运算符两侧的类型一致,则直接进行赋值。
如果赋值运算符两侧的类型不一致,但都是基本类型,在赋值时要进行类型转换,转换规则是由系统自动进行的,转换规则:
将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,然后赋予整型变量。
将整型数据赋给单、双精度变量时,数值不变,然后以双精度浮点数形式存储到变量中。
将一个double型数据赋给float变量时,先将双精度数转换为单精度,存储到float型变量的4个字节中,应注意双精度数值大小不能超出float型变量的数值范围。将一个float型数据赋给double型变量时,数值不变,在内存中以8个字节存储,有效扩展位到15位。
字符型数据赋给整型变量时,将字符的ASCII代码赋给整型变量。
将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量,只将其低字节原封不动地送到被赋值的变量(即发生“截断”);短整型数据分配2个字节,最大能表示32767,避免把占字节多的整型数据向占字节少的整型变量赋值,因为赋值后数值可能发生失真,应当保证赋值后数值不会发生变化,即所赋的值在变量的允许数值范围内。
整型数据之间的赋值,按存储单元中的存储形式直接传送;实型数据之间以及整型与实型之间的赋值,是先转换类型后赋值。
C语言的赋值语句属于表达式语句,由一个赋值表达式加上一个分号组成。
在if的条件中可以包含赋值表达式,但不能包含赋值语句。
赋值表达式的末尾没有分号,赋值语句的末尾必须有分号,一个表达式中可以包含一个或多个赋值表达式,但绝不能包含赋值语句。
可以用赋值语句对变量赋值,也可以在定义变量时对变量赋初值,也可以使被定义的变量的一部分赋初值。
不能写成:
在scanf函数中括号内变量a,b,c的前面要用地址符&,即&a,&b,&c表示变量在内存中的地址。该scanf函数表示从终端输入的3个数据分别送到地址为&a,&b,&c的存储单元,也就是赋给变量a,b,c。双撇号内用%lf格式声明,表示输入的是双精度型实数。
在scanf函数中,格式声明为“%lf%lf%lf”,连续三个“%lf”,要求输入三个双精度实数,两个数之间用空格分开。
在printf函数中,不是简单地使用%f格式声明,而是在格式符f的前面加了“7.2”,表示在输出x1和x2时,指定数据占7列,其中小数占2列。
几乎每一个C程序都包含输入输出,因为要进行运算,就必须给出数据,而运算的结果当然要输出,以便人们应用。没有输出的程序是没有意义的,输入输出是程序中最基本的操作之一。
注意以下几点:
所谓输入输出是以计算机主机为主体而言的。从计算机向输出设备输出数据称为输出,从输入设备向计算机输入数据称为输入。
C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的,printf和scanf不是C语言的关键字,而只是库函数的名字,其实可以不用printf和scanf这两个名字,而另外编写一个输入和输出函数,用来实现输入输出的功能,采用其他名字作为函数名。
各种C编译系统提供的系统函数库是各软件公司编制的,它包括了C语言建议的全部标准函数,还根据用户的需求进行补充一些常用函数,已对它进行了编译,成为目标文件(.obj文件)。
不同的编译系统所提供的函数库中,函数的数量、名字和功能是不完全相同的,有些通用函数(如printf和scanf等),各种编译系统都提供,成为各种系统的通用函数。
C语言函数库中有一批标准输入输出函数,它是以标准化输出设备(一般为终端设备)为输入输出对象;其中有putchar(输出字符)、getchar(输入字符)、printf(格式输出)、scanf(格式输入)、puts(输出字符串)、gets(输入字符串)。
要在程序文件的开头用预处理指令#include把有关头文件放在本程序中
#include<stdio.h>
用尖括号形式(如<stdio.h>)时,编译系统从存放C编译系统的子目录中去找所要包含的头文件(如 stdio.h),这称为标准方式。
如果用户想包含的头文件不是系统提供的相应头文件,而是用户自己编写的文件,这时应当用双撇号形式,否则会找不到所需的文件。
只要在本程序文件中使用标准输入输出库函数时,一律加上#include<stdio.h>指令。
在C程序中用来实现输入和输出的主要是printf函数和scanf函数。这两个函数是格式输入输出函数,用这两个函数输入输出时,必须指定输入输出数据的格式,即根据数据的不同类型指定不同的格式。
print函数(格式输出函数)用来向终端输出若干个任意类型的数据。
printf函数的一般格式为:
printf(格式控制,输出列表)
“格式控制”
是用双撇号括起来的一个字符串,称为格式控制字符串,简称格式字符串。
它包括两个信息:
格式声明。格式声明由“%”和格式字符组成,作用是将输出的数据转换为指定的格式后输出;格式声明总是由“%”字符开始的。
普通字符。普通字符即需要在输出时原样输出的字符;printf函数中双撇号内的逗号、空格和换行符,也可以包括其他字符。
输出列表
是程序需要输出的一些数据,可以是常量、变量或表达式。执行“\n”使输出控制移动到下一行的开头,从显示屏幕上可以看到光标已移到下一行的开头;由于printf是函数,因此,格式控制字符串和输出列表实际上都是函数的参数。
printf函数的一般形式可以表示为:
printf(参数1,参数2,参数3....参数n)
参数1是格式控制字符串,参数2~参数n是需要输入的数据,参数1是必须有的,参数2~n是可选的。
格式字符
d格式符。用来输出一个有符号的十进制整数。可以在格式声明中指定输出数据的域宽(所占的列数),如用“%5d”指定输出数据占5列,输出的数据显示在此5列区域的右侧。如:
若输出long(长整型)数据,在格式符d前加字母l(代表long),即“%ld”;若输出long long(双长整型)数据,在格式符d前加两个字母ll(代表long long),即“%lld”。
c格式符。用来输出一个字符。
可以看到输出第二个a时,前面有4个空格。
s格式符。用来输出一个字符串。
f格式符。用来输出实数(包括单、双精度、长双精度),以小数形式输出;
基本型,用%f。
不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。一般是实数中的整数部分全部输出,小数部分输出6位。
指定数据宽度和小数位数,用%m.nf。
用%m.n格式指定了输出的数据占m列,其中包括n位小数;对其后一位采取四舍五入方法处理,即向上或向下取近似值;如果把小数部分指定位0,则不仅不输出小数,而且小数点也不会输出。
注意:
一个双精度数只能保证15位有效数字的精确度,即使指定小数位数为50,也不能保证输出的50位都是有效的数字。
在用%f输出时要注意数据本身能提供的有效 数字,如float型数据的存储单元只能保证6位有效数字,double型数据能保证15位有效数字。
输出的数据向左对齐,用%-m.nf。
在m.n的前面加一个负号,其作用与%m.nf形式基本相同,但当数据长度不超过m时,数据向左靠,右端补空格。
e格式符。用来声明%e指定以指数形式输出实数。
数值按标准化指数形式输出(即小数点前必须有而且只有1位非零数字);
格式符e也可以写成大写E形式,此时输出的数据中的指数不是以小写字母e表示,而是以大写字母E表示。
i格式符。
作用与d格式符相同,按十进制整型数据的实际长度输出。一般习惯用%d而少用%i。
o格式符。
以八进制整数形式输出,将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。
用%o格式声明可以得到存储单元中实际的存储情况。
x格式符。
以十六进制数形式输出整数。
u格式符。
用来输出无符号型数据,以十进制整数形式输出。
g格式符。
用来输出浮点数,系统自动选f格式或e格式输出,选择其中长度较短的格式,不输出无意义的0.
格式声明一般形式为:
% 附加字符 格式字符
scanf(格式控制符,地址列表)
”格式控制“的含义同printf函数。”地址列表“是由若干个地址组成的列表,可以是变量的地址或字符串的首地址。
以%开始,以一个格式字符结束,中间可以插入附加的字符。
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
scanf函数中的格式控制后面应当是变量地址,而不是变量名。
如果在格式控制字符串中除了格式声明以外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符相同的字符。
scanf("a=%f,b=%f,c=%f",&a,&b,&c); 在输入数据时,应在对应的位置上输入同样的字符,即输入
a=1,b=3,c=2
因为系统会把它和scanf函数中的格式字符串逐个字符对照检查的,只是在%f的位置上代以一个浮点数。
在用”%c“格式声明输入字符时,空格字符和”转义字符“中的字符都作为有效字符输入,scanf("%c%c%c",&c1&c2,&c3);
在执行此函数时应该连续输入3个字符,中间不要有空格。
在输入数值数据时,如输入空格、回车、Tab键或遇非法字符(不属于数值的字符),认为该数据结束。
除了可以用printf函数和scanf函数输入和输出字符外,C函数库还提供了一些专门用于输入和输出字符的函数。
putchar函数的一般形式为:
putchar(c)的作用是输出字符变量c的值,显然输出的是一个字符。
用putchar函数既可以输出能在显示器屏幕上显示的字符,也可以输出屏幕控制字符,如putchar('\n')的作用是输出一个换行符,使输出的当前位置移到下一行的开头。
字符类型也属于整数类型,因此将一个字符赋给字符变量和将字符的ASCII代码赋给字符变量的作用是完全相同的,putchar函数是输出字符的函数,它输出的是字符而不能输出整数。
putchar(c)中的c可以是字符常量、整型常量、字符变量或整型变量;可以用putchar函数输出转义字符:
向计算机输入一个字符,可以调用系统函数库中的getchar函数(字符输入函数)。
getchar函数的一般形式为:
getchar函数没有参数,它的作用是:从计算机终端输入一个字符,即计算机获得一个字符。
getchar函数的值就是从输入设备得到的字符。
getchar函数只能接收一个字符,如果像输入多个字符就要用多个getchar函数。
在用键盘输入信息时,并不是在键盘上敲一个字符,该字符就立刻送到计算机中去,这些字符先暂时存在键盘的缓冲器中,只有摁下Enter键才把这些字符一起输入到计算机中,然后按先后顺序分别赋给相应的变量。
getchar函数不仅可以从输入设备获得一个可显示的字符,而且可以获得在屏幕上无法显示的字符,如控制字符。
用getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,而作为表达式的一部分,在表达式中利用它的价值。
第一个getchar函数得到的值为'B',因此putchar(getchar())相当于putchar('B'),输出‘B’。
也可以在printf函数中输出刚接收的字符:
printf("%c",getchar()); //%c是输出字符的格式声明
getchar()函数从键盘上读入一个大写字母,把它转换成为小写字母,然后用putchhar函数输出该小写字母。
同理,也可以将输入的小写转换成输出的大写。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。