2.1引例
1,/*和*/是注释,注内容必须包含在其之间,“/”和“*”之间不能有空格。
2,注释除了可以使用“/*注释内容*/”之外,还可以使用“//注释内容”。
1,\n是换行符
2.2C语言的数据类型
数据类型有三种:
1,基本类型;基本类型还可以分解为其他类型,主要为整型、字符型和浮点型。
2,构造类型; C语言中构造类型包括:数据类型、结构体类型、共用体类型和枚举类型。构造类型是根据已定义的一或多个数据类型、用构造的方法来定义的。
3,指针类型是C语言中一种特殊的,同时又具有重要作用的数据类型。
4,空类型(void)。
2.3C语言的常量
常量是指程序执行过程中,其值不发生改变的量,分为直接常量和符号常量两种。
2.3.1直接常量
直接常量又分为整型常量、实型常量、字符型常量和字符串常量。
1.整型常量
即为整数,包括正、负整数和零。C语言中,整型常量可以用十进制、八进制和十六进制表示。
十进制表示:由数字0~9,正、负号组成。
八进制表示:以0(数字0)为前缀,其后由数字0~7组成。八进制数一般是无符号数。
十六进制表示:以0x或0X为前缀,其后数字由0~9和字母A~F(字母大小写均可)组成。十六进制一般是无符号数。
2.实型常量
即为实数,又称浮点数。C语言中,实数只能用十进制表示,实数表示的方法有两种:小数形式和指数形式。
(1)小数形式:由整数部分、小数点和小数部分组成,如12.345,3.,-.123。整数、小数部分为0可省略不写,小数点不可省略。
(2)指数形式:由尾数部分、字母E或e和指数部分组成,格式为:±尾数E指数。以指数形式表示实数时,字母E (或e)的前后必须有数字,并且指数部分只能是整数。如12.-E3、1.5E、E6都是不正确的实数。
3.字符型常量
(1) 字符常量只能用单引号括起来,不能用双引号或其它括号。
(2) 字符常量只能是单个字符,不能是多个字符组成的字符串。
(3) 字符可以是ASCII字符集中的任意字符。按ASCII码的大小,不同的字符之间存在着次序,以字符的ASCII码值按升序连续排列。另外,对于控制符(如回车、换行等)与不可见字符,在C语言中通过转义字符来表示。
(4)表2.1 转义字符
转义字符 | 转义功能 | ASCII码值 |
---|---|---|
\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位十六进制所代表的字符 |
(5)转义字符使用示例
4.字符串常量
(1)字符串常量是由一对双引号””括起来的零个或多个字符序列,如:”HelloWorld”。
(2)字符串中可以使用空格字符、转义字符和其他字符,也可以使用汉字等文字符号。如:"china、""你好Visual C"等。字符串中还可以使用空字符,如:”” 表示空串,即不包含任何字符。
(3)字符串常量"Hello\nworld"占用12字节的内存空间,如图:
H | e | l | l | o | \n | W | o | r | l | d | \0 |
字符串长度等于该字符串中所包含的有效字符的个数,如“HelloWorld”的长度为10。
在字符串中如遇到`\0(`\0`是字符串的结束符)则认为该字符串结束)。如果字符串有转义字符则一个转义字符作为一个字符。
2.3.2符号常量
在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。
符号常量在使用之前必须先定义,其一般形式为:
#define 标识符 常量值
一个#define命令只能定义一个符号常量,若要定义多个符号常量,需使用多个#define命令。
1.利用符号常量计算价格
程序中PRICE为符号常量,其值为20.当商品单价发生改变时,只需要修改PRICE的值,程序其他部分无想改变。
符号常量的使用对编程的好处:
(1)增加程序的可读性:通过标识符就知道该常量的意义。
(2)提高程序的可维护性:通过符号常量使得改常量很方便,只在常量的定义处修改即可。
(4)简化程序代码:通过符号常量可以简化复杂表达式的重复输入。
(4)方便数组的定义:可以将整型符号常量作为数组的长度。
2.4C语言的变量
在程序的运行过程中,其值可以被改变的量称为变量。变量用于从外部接收数据、保存一些不断变化的值、保存中间结果及最终结果,而这些都无法用常量来实现。一个变量应该有一个名字即变量名,在内存中占用一定的储存单元,在该储存单元中存放变量的值。
2.4.1变量的定义与使用
在C语言中,所有的变量必须先定义后使用。
1.变量的定义
(1)类型说明符必须是C语言中的有效数据类型,如int、float、double、char等,用于指定变量的类型,该类型决定了编译时分配给变量的内存单元的多少。
(2)变量名表可以由一个或多个变量名组成,各变量名之间用“,”分隔。变量名必须是合法的C语言标识符,变量名一般使用小写字母。
(3)变量的定义必须放在变量的使用之前,一般在函数体的开头部分进行定义。
int r; | /*定义r为整型*/ |
float v,f; | /*定义v、f为单精度浮点型*/ |
double x,y; | /*定义x、y为双精度浮点型*/ |
char ch | /*定义ch为字符型* |
2.变量的初始化
C语言允许在定义变量的同时对变量赋值,这个过程称为变量的初始化。
int x=2; | /*定义一个整型变量x并赋值初值2*/ |
int s=1,t=1; | /*定义两个整型变量s和t,并分别赋初值1*/ |
float f=3.68; | /*定义一个单精度型变量f并赋初值3.68*/ |
char ch='x' | /*定义一个字符型变量ch并赋初值字符x*/ |
(1)对一个变量赋初值之后,该值被存储在分配给该变量的内存空间中。
(2)不允许对多个未定义的同类型变量连续初始化。
(3)初始化时,“=”右边表达式的数据类型和“=”左边的变量的类型如果不一致,系统会进行自动赋值转换。
(4)没有进行初始化的变量,其值是由定义时所使用的存储类型决定的。
3.变量的使用
使用变量时,变量应该先赋值,后引用。
变量使用示例
运行结果:
若程序运行时输入:
10↙
则程序的运行结果如下:
10,75,10,A
2.4.2整型变量
整型数据关键字、字节数和取值范围
关键字 | 类型 | 占用字节数 | 取值范围 |
---|---|---|---|
short int | 短整型 | 2 | -32768~32767 |
int | 整型 | 4 | -2147483648~2147483647 |
long int | 长整型 | 4 | -2147483648~2147483647 |
unsigned short | 无符号短整型 | 2 | 0~65535 |
unsigned int | 无符号整型 | 4 | 0~4294964295 |
unsigned long | 无符号长整型 | 4 | 0~4294964295 |
(1)各种无符号整数所占的字节数与相应的有符号整数相同。但由于省去了符号位,故不能表示负数。
(2)有符号整数以二进制补码形式存储。最左边第1位表示符号,该位为0,表示正数,该位为1,表示负数。
(3)无符号整数以二进制原码形式存储
(4)常用关键字:int,unsigned int。
不同类型整型变量的定义与使用示例
短整型变量的溢出
由表整型数据关键字、字节数和取值范围可知短整型变量的取值范围是-32768~32767,变量a的值加1以后超出该范围,产生意想不到的结果。
2.4.3实型变量
C语言中实型变量分单精度(float型)和双精度(double型)两类。
实型的关键字及占用内存字节数和取值范围表
关键字 | 类型 | 占用字节数 | 取值范围 |
---|---|---|---|
float | 单精度型 | 4 | 3.4E-38~3.4E+38 |
double | 双精度型 | 8 | 1.7E-308~1.7E+308 |
(1)单精度型数据能保留7位有效数字。
(2)双精度型数据能保留16位有效数字。
实型变量的使用示例
由于a是单精度浮点型,有效数字位数为7位,其中整数已占4位,故3位小数之后的均为无效数字。b虽然是双精度型,有效数字位数为16位,但VisualC+2010规定双精度小数后最多保留6位,其余部分四舍五人。
2.4.4字符型变量
(1)字符型变量的值是字符常量,即用单引号引起来的单个字符。
(2)字符型变量的类型说明符是char,其类型说明的格式和命名规则与整型变量相同。
(3)由于字符常量在内存中占用一个字节,用于存储它的ASCII码值,所以C语言中的字符具有数值特征,可以像整数一样参加运算。允许对整型变量赋以字符值,也允许对字符变量赋以整型值。
字符变量的使用示例
大写字母转换为小写字母
c1,c2被说明为字符变量并赋予字符值,由于大小写字母的ASSCII值相差32,因此运算后大写字母换成小写字母。最后分别以字符型和整型输出。
2.5运算符和表达式
C语言中,运算符和表达式数量之多,在其他高级语言中是很少见的,
正是丰富的运算符和表达式使C语言功能十分完善,这也是C语言的特点之一。
2.5.1赋值运算符和赋值表达式
赋值运算符有“=”、“+=”、“-=”、“*=”、“/=”和“%=”等。
用赋值运算符将运算对象连接而成的表达式称为赋值表达式。
(1)简单赋值运算符
最简单的赋值运算符就是“=”,它的作用是将一个数值赋给一个变量。如r=2的作用是执行一次赋值操作(或称赋值运算)。 把常量2赋给变量r。也可以将一个表达式的值赋给一个变量。
变量赋值的例子:
int a,b,c= 3;定义a,b,c为整型变量,但只对c进行了賦值操作,c的值为3。如果对几个变量赋子同个初值,应写成:int a=3,b=3,c=3;表示a,b,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语言中,由赋值运算符将一个变量和一个表达式连接起来的式子所组成。
一般形式为:变量 =表达式
赋值表达式的例子:
v=4.0*PI*r*r*r/3.0
a=15+(i=6)
b=(x=3)+(y=4)
而" 3=x"和“a+b=4”都是错误的赋值表达式。
赋值表达式的执行过程:
(1)计算赋值运算符右侧表达式的值。
(2)将所计算出的值赋给赋值运算符左侧的变量。
注意:如果“=”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型。配值表达式的右边也可以是一个赋值表达式,如"a=b=c=6"。
2.5.2算数运算符和算数表达式
1.基本的算术运算符 (双目运算符)
运算符 | + | - | * | / | % |
---|---|---|---|---|---|
名称 | 加 | 减 | 乘 | 除 | 取余 |
(1)+加法运算符,为双目运算符,其功能是进行求和运算,如3+4的值为7。
(2)-作为单目运算符使用时,是取负运算,如-3;作为双目运算符使用时,是进行求差运算,如3-4的值为-1。
(3)*乘法运算符,为双目运算符,功能是进行求乘积运算,如3* 4的值为12。
(4)/除法运算符,为双目运算符,功能是进行求商运算,如a/b。
在计算a/b时,如果a和b都是整型,则其商也为整型,小数部分被舍去,如3/4的结果为0,4/3的结果为1。如果a和b中有一个是实型,则a和b都转换为double类型,然后相除,结果为double类型,如3.0/2的结果为1.5.
(5)%求余运算符,为双目运算符,功能是进行求余数的运算,如a%b,其结果为a 除以b后的余数。
求余运算要求参与运算的两个运算对象都必须是整型,其结果也是整型。如4%3的结果为1。求余运算结果的符号与第一个操作数符号相同, 如-4%3的值为-1,4%-3的值为1。
2.自增、自减运算符(单目运算符)
1、++
自增运算符:使变量的值自加1
2、--
自减运算符:使变量的值自减1
有两种使用形式:
(1)前缀方式:用于变量前面,它是 “先计算,后使用”
(2)后缀方式:用于变量后面,它是 “先使用,后计算”
3.算术运算符的优先级和结合性
- 单目运算符的优先级高于双目运算符
- 双目算术运算符中*、/、%的优先级高于+、-
- 在优先级相同的情况下,按规定的“结合方向”进行处理
4.算术表达式
1.算术表达式是由算术运算符、运算对象和括号连接起来的式子,运算对象可以是常量变量和函数等。
2.通常数学表达式均可写成C语言的算术表达式,但是有些数学表达式无法直接用C语言的算术表达式写出,此时需要调用C语言中的数学函数来实现。
算术表达式使用注意:
(1)表达式中的乘号不能省略,且表达式中的所有字符均应写在同一行上。
(2)在表达式中还可以使用多层圆括号(不能使用中括号[]和花括号{}),但是要注意括号的配对。
(3)在数学中,5X6÷4 的运算结果与6÷4X5的结果相同,都是7.5,但是C语言中表达式5*6/4的结果却与6/4*5的结果不一样。 另外,还需注意8/(8/ 10)之类的表达式,因为(8/10)的结果为0,用0做除数将会出现运算溢出的错误,为了不使8/10的结果为0,应将整型常亮改为实型常量8.0/10。
例题:输入一个3位数的正整数,输出其反序数。
2.5.3 逗号运算符和逗号表达式
C语言中逗号“,”也是一种运算符,其功能是把多个表达式连接起来组成一个表达式,称为逗号表达式。
逗号表达式的一般形式为:表达式1,表达式2,…,表达式n。
1.逗号表达式的执行顺序:从左到右依次执行每个表达式,并把最后一个表达式的值作为整个逗号表达式的值。
2.逗号表达式的值为“表达式n”的值。
3.逗号运算符是双目运算符,其优先级最低,是左结合的。
4.并非所有出现逗号的地方都可以作为逗号表达式,如printf("%d%d",&a,&b)
,其中的 "%d%d",&a,&b
并不是一个逗号表达式,而是printf
函数的参数,其中逗号只是作各变量之间的分隔符。
逗号表达式应用示例
2.5.4求字节数运算符
运算符sizeof用于计算数据类型所占的字节数,它是一个单目运算符,优先级高于双目运算符,其一般格式为:
1. sizeof(表达式)或sizeof 表达式。
2.sizeof(数据类型名)。
不同数据类型字节数示例:
运行结果:
char类型占1字节
short int类型占2字节
int类型占4字节
float类型占4字节
double类型占8字节
求字节数运算符示例:
说明:执行语句“a= sizeof(3+5.0);”时,先计算出3+5.0的结果为double型的8.0,然后再对其求字节数,结果为8。执行语句“b= sizeof 3+5.0”时,由于sizeof运算符的优先级高于+运算符,因此先计算sizeof 3,其值为4,然后计算4+5.0=9.0。赋值给int型的变量b时,b=9。" chin"是字符审,其字节数为字符串的长度加1个字节,增加的这个字节用于存放字符串的结束符'\0'。
2.6数据类型转换
C语言规定,各种不同类型的数据进行运算时,不同类型要先转换成相同类型的数据才能进行运算。数据类型的转换可以分为自动转换和强制转换。数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。数据类型的各种转换只影响表达式的运算结果,并不改变原变量的定义类型,并且其数据值也不会发生任何改变。
2.6.1自动类型转换
自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换。
这种转换不需要程序员干预,会由C语言编译系统自动完成。
转换规则是:
把占用内存空间少的(低级)类型向占用空间多的(高级)类型转换,以保证运算的精度。
若有定义“double int i=10;float f=3.8,d=153;”,则表达式d+'a'+'i'*d/f的值的类型是double型。
分析:
1.将int型变量i和float型变量f转换为double型后,进行i*d/f的运算,结果为double型。
2.将char型常量’a’转换为int型,进行d+’a’的计算,此时“+”左右两边数据的类型不同,则再将int型转换为double型,进行加法运算,结果为double型。
3.将(1)的结果和(2)的结果进行加法计算,最终结果为double型。
2.6.2强制类型转换
强制类型转换采用强制类型转换运算符将某种数据类型强制转换成指定的数据类型
其一般形式为:(类型说明符)(表达式)。
强制类型转换示例
需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换
强制类型转换是一种不安全的转换,如果是从高级类型转换成低级类型,则会损失数据的精度
(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换。
(2)强制类型转换是一种不安全的转换,如果是从高级类型转换成低级类型,则会损失数据的精度 。
(3)强制转换类型并不改变表达式中变量的类型和值。(临时性)