目录
2.1引例
#include <stdio.h>:stdio.h为系统文件,内部定义了printf()等方法,在程序最开始可以使用include将头文件引入进来
int main(void):在一个C程序中有且仅有一个main()函数,他是程序运行的入口,main函数前面表示的是程序的返回值类型,后面表示的是传入参数,这里传入参数为void,也就是为空(可省略),返回参数是int类型
printf("Programming is fun");:此处调用了标准输出函数,会将引号中的内容输出到屏幕上,语句后的分号表示该语句的结束
return() 语句可以就结束程序,一般返回0表示程序运行正常,返回其他值则表示不同的错误情况
2.2 C语言的数据类型
2.3 C语言的常量
2.3.1 直接常量
直接常量又分为整型常量、实型常量,字符型常量和字符串常量。
1.整型常量
整型常量即整数,包括正整数、负整数和零。C语言中,整型常量可以用十进制、人进制
和十六进制表示。
十进制表示:由数字 0~9,正,负号组成,如 369,一663 等;
八进制表示:以 0(数字 0)为前缀,其后由数字 0~7 组成,如 0163,036等;人进制数一
般是无符号数。如 0192、—011 都是不合法的八进制常量。
十六进制表示:以Ox或 OX 为前缀,其后由数字0~9 和字母 A~F(字母大小写均可)组
成,如 0x12cd,OX6Fa等。十六进制数一般是无符号数。
注意:
(1)在一个整型常量后面加一个字母 u或U,认为是 unsigned int 型,如 246U。
(2)在一个整型常量后面加一个字母 1或 L,认为是 long int 型,如 12L。
2.实型常量
实型常量即实数,又称为浮点数。C语言中,实数只能用十进制式表示,实数的表示方法有两种:小数形式和指数形式。
(1)小数形式:由整数部分,小数点和小数部分组成,当整数部分或者小数部分为0时,可以省略不写,但是小数点不可以省略。如12.345,3.,-.123等均为正确的实数。
(2)指数形式:由尾数部分,字母E或e和指数部分组成 ,格式为:+-尾数E指数。如1.23E-2,3.14E+3等,它们表示的数字分别为1.23*10^-2,3.14*10^3。
注意:
(1)以小数形式表示实数时,必须有小数点,并且小数点的前,后至少一边要有数字。
(2)以指数形式表示实数时,字母E(或e)的前后必须有数字,并且指数部分只能是整数。如12.-E3,1.5E,E6都是不正确的实数。
3.字符型常量
字符常量指单个字符,用一对单引号及其括号所括起的字符来表示。如'a','B','=','$','?'都是合法的字符常量。
特点:(1)字符常量只能用单引号括起来,不能用双引号或其他括号。
(2)字符常量只能是单个字符, 不能是字符串。
(3)字符可以是ASCLL字符集中的任意字符。按ASCII码的大小,不同的字符之间存在着次序,以字符的ASCII码值按升序连续排列。
(4) 对于控制符(如回车、换行等)与不可见字符,在C语言中通过转义字符来表示。
转义字符 | 转义功能 | ASCLL码值 |
\0 | 空字符 | 0 |
\a | 响铃 | 7 |
\b | 退格(Backspace) | 8 |
\t | 水平制表符( 即横向跳格) | 9 |
\n | 回车换行(Enter) | 10 |
\v | 竖向跳格 | 11 |
\f | 换页 | 12 |
\r | 回车 | 13 |
\" | 双引号(") | 34 |
\' | 单引号( ') | 39 |
\? | 问号(?) | 63 |
\\ | 反斜线字符(\) | 92 |
\ddd | 1~3位八进制所代表的字符 | |
\xhh | 1~2位十六进制所代表的字符 |
#include<stdio.h> int main() { char b,c,d,e; b='\43'; \数字 八进制 c='\103'; d='\x2a'; \x数字 十六进制 e='\x41'; printf("b=%c,c=%c,d=%c,e=%c\n",b,c,d,e); printf("\"good\0morning!\b\"!\n"); printf("\123456"); "前面计算机自己加入\0 return 0; }
4 字符串常量
字符串常量是由一对双引号””括起来的零个或多个字符序列,如:”HelloWorld”
字符串中可以使用空格字符、转义字符和其他字符,也可以使用汉字等文字符号。如: "china","你好Visual C","\tVisual C"等
字符串中还可以使用空字符,如:”” 表示空串,即不包含任何字符
注意:(1)系统自动在每个字符串的尾部加上’\0’作为字符串的结束标志
(2)n个字符组成的字符串,在内存中要占用n+1个字节空间
(3)可以使用sizeof运算符来计算字符串占用的内存空间大小
(4)字符串的长度等于该字符串中所包含的有效字符的个数
(5)在字符串中如遇到’\0’则认为该字符串结束
(6)如果字符串中有转义字符,则一个转义字符作为一个字符
(7)可以使用strlen()函数计算字符串的长度
(8)字符常量和字符串常量在内存中的存储情况是不同的
(9)如’6’在内存中占1个字节,存储的是其ASCII码
(10)“6”在内存中占2个字节,一个字节存储’6’,一个字节存储’\0’
2.3.2符号常量
一个#define命令只能定义一个符号常量,若要定义多个符号常量,需使用多个#define命令。
格式:#define 标识符 常量值
符号常量的使用,可以为编写程序提供很多好处:
(1)增加程序的可读性:通过标识符就知道该常量的意思,即见名知义。
(2)提高程序的可维护性:通过符号常量使得修改常量很方便,只需在常量的定义处修改即可。
(3)简化程序代码:通过符号常量可以简化复杂表达式的重复输入。
(4)方便数组的定义:可以将整型符号常量作为数组的长度。
2.4 C语言的变量
2.4.1 变量的定义与使用
在C语言中,所有的变量必须先定义后使用
1 变量的定义
定义格式:类型说明符 变量名表
其中:(1)类型说明符必须是C语言中的有效数据类型,如int,float,double,char等 ,用于指定变量的类型,该类型决定了编译时分配给变量的内存单元的多少。
(2)变量名表可以由一个或多个变量名组成,各变量名之间用“,”分隔。变量名必须是合法的C语言标识符,变量名一般使用小写字母。
(3)变量的定义必须放在变量使用之前,一般在函数体开头部分进行定义。
2 变量的初始化
C语言允许在定义变量的同时对变量赋值,这个过程称为变量的初始化。
对变量初始化时需注意:(1)对一个变量赋值之后,该值被储存在分配给变量的内存空间中。
(2)不允许对多个未定义的同类型变量连续初始化,如:“int x=y=3;”是不合法的,应写成“int x=3 y=3;”。
(3)初始化时,一般使“=”右边表达式的数据类型和“=”左边的变量的类型一致,如果不一致,系统会进行自动赋值转换。
(4)没有进行初始化的变量,其值是由定义时所使用的储存类型决定的。全局变量和static型变量的值是0或'\0',其它储存类型的局部变量的值是未知的。
3 变量的使用
使用变量时,应先赋值,后使用。
2.4.2 整型变量
Visual C++ 2010环境下,各种整型的关键字及占用内存字节数和取值范围如下表:
关键字 | 类型 | 占用字节数 | 取值范围 |
---|---|---|---|
short int | 短整型 | 2 | -32768~32767(-2^15~2^15-1) |
int(比较实用) | 整型 | 4 | -2147483648~2147483647(-2^31~2^31-1) |
long int | 长整型 | 4 | -2147483648~2147483647(-2^31~2^31-1) |
unsigned short | 无符号短整型 | 2 | 0~65535(0~2^16-1) |
unsigned int(比较实用) | 无符号整型 | 4 | 0~4294964295(0~2^32-1) |
unsigned long | 无符号长整型 | 4 | 0~4294964295(0~2^32-1) |
说明:(1)各种无符号整数所占的字节数与相应的有符号整数相同。但由于省去了符号位,故不能表示负数。
(2)有符号整数以二进制补码形式储存。最左边第一位表示符号,该位为0,表示正数,该位为1,表示负数。
(3)无符号整数以二进制原码形式储存。
2.4.3 实型变量
C语言中实型变量分单精度(float型)和双精度(double型)两类。
实型的关键字及占用内存字节数和取值范围如表所示:
关键字 | 类型 | 占用字节数 | 取值范围 |
---|---|---|---|
float | 单精度型 | 4 | 3.4E-38~3.4E+38 |
double(比较实用) | 双精度型 | 8 | 1.7E-308~1.7E+308 |
单精度型数据能保留7位有效数字,双精度型数据能保留16位有效数字。
VisualC++2010规定双精度小数后最多保留6位,其余部分四舍五入。
2.4.4 字符型变量
字符型变量的值是字符常量,即用单引号引用起来的单个字符。字符型变量的类型说明符是char。
2.5 运算符和表达式
C语言中运算符和表达式数量之多,在其他高级语言中很少见的。正是丰富的运算符和表达式使C语言功能十分完善,这也是C语言的特点之一。
2.5.1 赋值运算符和赋值表达式
C语言中赋值运算符有“=”,“+=”,“-=”,“*=”,“/=”和“%=”等。用赋值运算符将运算对象连接而成的表达式称为赋值表达式。
1.简单赋值运算符
最简单的赋值运算符就是“=”,它的作用是将一个数值赋给一个变量。如r=2的作用是执行一次赋值操作(或称赋值运算)。把常量2赋给变量r。也可以将一个表达式的赋给一个变量。
正确表示:int a=3 b=3 c=3 错误表示: int a=b=c=3
2.复合赋值运算符
在简单赋值运算符前面加上算术运算符就构成符合赋值运算符。
运算符 | 应用举例 | 等价形式 |
---|---|---|
+= | a+=x | a=a+(x) |
-= | a-=x | a=a-(x) |
*= | a*=x | a=a*(x) |
/= | a/=x | a=a/(x) |
%= | a%=x | a=a%(x) |
3.赋值表达式
在C语言中 ,赋值语句属于表达式语句。赋值表达式是由赋值运算符将一个变量和一个表达式连接起来的式子所组成。
一般形式:变量=表达式
由于赋值表达式的作用是将一个表达式的值赋给一个变量,因此赋值表达式具有计算和赋值的双重功能。需要注意:赋值运算符的左侧必须是一个变量。
赋值表达式的执行过程:(1)计算赋值运算符右侧表达式的值。
(2)将所计算出的值赋给赋值运算符左侧的变量。
区分赋值表达式和赋值语句的方法:
赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号,在一个表达式中可以包含一个或多个赋值表达式,但绝对不能包含赋值语句。
注意:(1)如果“=”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型。
(2)赋值表达式的右边也可以是一个复制表达式,如“a=b=c=6”。由于赋值运算符具有右结合性。
2.5.2 算术运算符和算术表达式
1.基本的算术运算符
双目运算符
运算符 | + | - | * | / | % |
---|---|---|---|---|---|
名称 | 加 | 减 | 乘 | 除 | 求余 |
两个整型数据做除法运算时,结果一定是整数
求余运算的结果是两个整型数据相除的余数。求余运算只能用于整型数据的运算
算数运算符两边的数据类型应相同,若不同时,编译系统会先转换为同一数据类型,然后再进行运算。
2.自增,自减运算符
单目运算符
(1)-
负号:负数
(2)++
自增运算符:使变量的值自加1
(3)--
自减运算符:使变量的值自减1
有两种使用形式:
(1)++i(--i):用于变量前面,它是 “先计算,后使用”
(2)i++(i--):用于变量后面,它是 “先使用,后计算”
3.算术运算符的优先级和结合性
(1)结合性:单目运算符是右结合的,双目算术运算符是左结合。
(2)优先级:“++,--,-”>“*,/,%”>“+,-”,即单目运算符的优先级高于双目运算符,双目算术运算符中*,/,%的优先级高于+,-。
注意:在优先级相同的情况下,按规定的“结合性”进行处理。
4.算术表达式
(1)算术表达式是由算术运算符,运算对象和括号连接起来的式子,运算对象可以是常量,变量和函数。
(2)通常数学表达式均可写成C语言的算术表达式,但也有些数学表达式无法直接用C语言的算术表达式写出,此时需要调用C语言中的数学函数来实现。
(3)表达式计算以后会得到一个确定的值和类型,其类型由所使用的具体运算符和运算对象决定。
注意:(1)表达式中的乘号不能省略,且表达式中的所有字符均应写在同一行上。
(2)在表达式中还可以使用多层圆括号(不能使用中括号和花括号),但是要注意括号的配对。
(3)在数学中,5*6/4的运算结果与6/4*5的结果相同,都是7.5,但是C语言中表达式5*6/4的结果却与6/4*5的结果不一样。
2.5.3 逗号运算符和逗号表达式
逗号运算符(,):功能是把多个表达式连接起来组成一个表达式,称为逗号表达式。
一般形式:表达式1,表达式2,...,表达式n
(1)逗号表达式的执行顺序是:从左到右依次计算每个表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。
(2)逗号运算符是双目运算符,其优先级最低,是左结合的。
(3)并非所有出现逗号的地方都为逗号表达式,如在变量说明语句中,以及函数参数表中逗号只是用作各变量之间的分隔符。
2.5.4 求字节数运算符
运算符sizeof用于计算数据类型所占的字节数,它是一个单目运算符,优先级高于双目运算符。
一般格式:(1)sizeof(表达式)或sizeof 表达式
(2)sizeof(数据类型名)
2.6数据类型转换
C语言规定,各种不同数据类型的数据在一起运算时,不同类型的数据要先转换成相同类型的数据才能进行运算。数据类型的转换可以分为自动转换和强制转换。
2.6.1 自动类型转换
不同类型的数据在一起运算时,编译系统会自动进行类型转换。进行自动转换的规则是:把占用内存空间少的(低级)类型向占用空间多的(高级)类型转换,以保证运算的精度。
(1)图中的纵向箭头表示必定的转换。
(2)图中的横向箭头表示当经过纵向的转换后,进行运算的数据类型仍然不同时进行的转换方式。
2.6.2 强制类型转换
强制类型转换是采用强制类型运算符将某种数据类型强制转换成指定的数据类型。
一般形式:(类型说明符)(表达式)
功能:把表达式的运算结果强制转换成类型说明符指定的类型。
进行强制类型转换时需注意:
(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换。
(2)强制类型转换是一种不安全的转换.如果是从高级类型转换成低级类型,则会损失数据的精度。
(3)强制类型转换并不改变表达式中变量的类型和值。