c语言笔记

第二章 数据类型、运算符和表达式
2.2 常量和变量
2.2.1 常量
常量在程序执行过程中其值保持不变。分为:整型常量、浮点常量、字符常量和字符串常量。
1.整型常量
整型常量就是整常数。
(1)十进制整型常量
十进制整型常量没有前缀,其数码为0~9.
以下皆为合法:56、-100、2004
(2)八进制整型常量
八进制整型常量必须以0开头,既以0作为八进制数的前缀,数码取值为0~7。八进制数通常是无符号数。
以下皆为合法:017(十进制15)、0101(十进制为65)
以下皆为不合法:17(无前缀0)、082(包含非八进制数码)
(3)十六进制整型常量
十六进制整型常量的前缀为0X或Ox,其数码取值为0~9,A~F或a~f。
以下皆为合法:OX2A(十进制为42)、OxA0(十进制为160)
(4)整型常量的后缀
长整型数使用后缀“L”或“l”来表示的。
如果是一个无符号整型常量,则在整数值后面加上“U”或“u”。
无符号的长整型常量的表示方法是在整数后面加上“UL”,“LU”,“ul”或“lu”。
2.浮点型常量
浮点型也称实型,浮点型常量也称为浮点数或者实数。只采用十进制表示:十进制小数形式和指数形式。
(1)十进制小数形式
由数字0~9和小数点组成(注意必须有小数点)
(2)指数形式
由符号(+或-)、整数部分、小数点(、)、小数部分(e或E+-n)和浮点数后缀组成。
其一般形式为:
[+或-][整数部分][.][小数部分][(e,E)+-n][后缀]
其中,“整数部分.小数部分”一般称为尾数;e+-n(E+-n)表示尾数乘上10的正或负n次方,n称为阶码。n为1~3位十进制无符号整常数,可以有前置0,但并不代表八进制整常数。例如:-1.23456e+4-1,-1.23456e+04均表示浮点数-12345.6.
后缀表示浮点数的类型。浮点数后缀可以为f或F,l或L。
当后缀省略时,浮点数类型为double;
当后缀为f或F时,浮点数类型为float;
当后缀为l为L时,浮点数类型为long double。
符号[]表示该组成部分可以有或无(可选项),但必须遵循浮点数的下列规则:
2.1.一个浮点数可以无整数部分或小数部分,但不能二者皆无;
2.2.一个浮点数可以无小数点或指数部分,但不能二者皆无。
以下皆为合法:
.234e (无整数部分)
1. (无整数部分)
25E5 (无小数点)
1.23 (无指数部分)
以下皆为不合法:
345 无小数点
-E7 阶码标志E之前既无整数部分也无小数部分
100.-E3 负号位置不对
-5 无阶码标志也无小数点
2.7E 无阶码
3.字符型常量
字符常量使用单引号括起来的一个字符。占据一个字节的容量。字符常量的值就是该字符的ASCLL码值。因此,一个字节常量

实际上也是一个字节的整型常量,可以参与各种运算。
以下皆为不合法:''','"','\\'
常用转义字符及其含义:
\n 回车换行 10
\t 横向跳到下一指标位置 9
\b 退格 8
\r 回车 13
\f 走纸换页 12
\\ 反斜线符(\) 92
\' 单引号符(') 39
\'' 双引号符 (") 34
\a 鸣铃 7
\0 空字符(=NULL) 0
\ddd 1~3位八进制所代表的字符
转义字符的运用:
#include "stdio.h"
void main()
{
char ch;
ch='\36';
printf("ch is %c",ch);
getch();
}
4.字符串常量
字符串常量是由一对双引号括起来的字符序列。
字符串常量与字符常量的区别:
4.1字符常量由单引号括起来,字符串常量由双引号括起来。
4.2字符串常量只能是单个字符,字符串常量则可以是一个或多个字符。
4.3可以拔一个字符常量赋予一个字符常量,但不能把一个字符常量赋予一个字符变量。
4.4字符常量占一个字节的内存空间。字符串常量占得内存字节数等于字符串中的字符数加1。增加一个字节中存放字符'\0
'(ASCLL码为0)。这是字符串结束标志。
5.符号常量
符号常量使用标识符代表一个常量。例如:#define 标识符 常量
优点:一改全改
2.2.2 变量
在程序执行过程中,值可以改变的量称为变量。变量值的改变实际上就是对应存储单元中内容的改变。
变量的命名必须遵循以下几条规则:
2.2.2.1、必须是以英文字母或下划线开头,由字母、数字和下划线组成的字符序列。
以下皆为不合法:my-name,5month
2.2.2.2、不能与c语言关键字(保留字)重名。
2.2.2.3、变量名的长度不受限制。
2.2.2.4、c语言对变量名的大小写敏感。
2.2.2.5、见名知义
2.2.2.6、最好不要用下划线作为变量名的开头。
2.2.2.7、习惯上符号常量的标识符用大写字母,变量标识符可以大小写结合。
1.整型变量
整型 int
根据整型数在存储器中占用的字节数分类
短整型 short int short
长整型 long int long
根据是否带有符号
有符号整型数 signed int
无符号整型数 unsigned int
int 整型 -32768~32767 2
signed int 有符号整型 -32768~32767 2(上述二者等效)
unsigned int 无符号整型 0~65535 2
short int 短整型 -32768~32767 2
signed short int 短整型 -32768~32767 2(上述二者等效)
unsigned short int 0~65535 2
long int 长整型 -2147483648~2147483647 4
signed long int 长整型 -2147483648~2147483647 4(上述二者等效)
unsigned long int 无符号长整型 0~4294967295 4
float 单精度浮点型 约|3.4*10的-38次|~|3.4*10的38次| 有效数位7位 4
double 双精度浮点型 约|1.7*10的-308次|~|1.7*10的308次| 有效位15

位 8
long double 长双精度浮点型 约|3.4*10的-4932次|~|1.1*10的4932次| 有效位数18 10
char 字符型 -128~127 1
signed char 有符号字符型 -128~127 1 (上述二者等效)
unsigned char 无符号字符型 0~255 1
2.浮点型变量
float 单精度型 4
double 双精度型 8
3、字符型变量
字符变量用来存储字符常量,即单个字符。用char来表示
允许把字符变量按整型量输出,也允许把整型量按字符量数出。
#include "stdio.h"
void main()
{
char ch='a';
int i=ch;
printf("%c ASCLL is %d\n",ch,ch);
printf("%c ASCLL is %d\n", i,i);
getch();
}

2.3运算符和表达式
记述各种不同运算过程的符号称为“运算符”。
运算符与数据相结合形成了表达式。
按参与运算的对象数目:单目运算符、双目运算符、三目运算符;
按照功能可分为:算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、自增自减运算符、条件运算符、逗号运算符。
2.3.1 表达式

一般来讲,表达式是由运算符和运算量所组成的符合c的语法的算式。
运算量:变量、常量、有返回值的函数。
从严格的定义上讲:运算量式表达式;用括号括起来的表达式还是表达式。
2.3.2 算术运算符与算术表达式
+ 单目运算表示正号,双目运算表示加法运算
- 单目运算表示减号,双目运算表示减法运算
* 乘法运算
/ 除法运算
% 取模运算(求余数)
注意:%运算符要求运算量必须是整型,且%后面的运算量不能为0。
15.5+5=20.5
15.5为浮点型,5为整型,此时,将5转换为浮点型5.0进行运算。
1.算术运算时的自动类型转换
基本规则:双目运算符的两个运算量中,值域较窄的类型向值域较宽的类型转换。
short,char—>int—>unsigned—long—>unsigned long— long double
>double
?
|
float
2、赋值运算时的自动类型转换
赋值转换将右值表达式结果的类型转换成左值表达式的数据类型。
3、强制类型转换
强制类型转换靠强制类型那个转换运算符来实现数据类型转换的,因此强制类型转换是叫做显式转换。
一般形式:(类型名)表达式
作用:将表达式转换成“类型名”所指定的类型。
2.3.3 关系运算符和关系表达式
关系运算符:<、<=、==、>、>=、!=.
关系运算符都是双目运算符,它用来比较两个运算量之间的关系。
用关系运算符将前后两个运算量连接起来的式子称为“关系表达式”。
注意:当关系表达式成立时,表达式的结果为整数1,否则为整数0。
关系表达式的作用是用来描述条件。
2.3.4逻辑运算符与逻辑表达式
逻辑运算符包括:&&、||、!。

中&&、||是双目运算符,||是单目运算符。
逻辑运算符及运算量按一定规则所构成的表达式称为逻辑表达式。
表达式x 表达式y !x !y x&&y x||y
非0 非0 0 0 1 1
非0 0 0 1 0 1
0 非0 1 0 0 1
0 0 1 1 0 0
基于上述特性,为了提高程序运行的速度,规定:对于逻辑&&,若做表达式为“假”,则无需判断右边表达式的值即可断定逻辑表达式为假;||亦如此。
2.3.5自增和自减运算
自增和自减运算:++、--。
++和--是单目运算符,他的运算量一般是整型变量。++将运算量的值加1,--将运算量的值减1,结果类型与运算量类型相同。
前置运算时:先变后用。
后置运算s时:先用后变
2.2.6赋值运算符与赋值表达式
基本赋值运算符是:=,它可以和算术运算符(+、-、*、/、%)及位运算符(&、|、^、<<、>>)
1、基本赋值运算
即奔赴值运算符“=”是一个双目运算符,它的一般表达式为
左值表达式=右值表达式
在基本赋值表达式中,左值表达式一般为变量名。
2.复合赋值运算
在赋值运算符“=”前加上其他运算符,便构成了复合赋值运算。
总共有十种:+=、-=、*=、/=、%=、&=、|=、..^=、<<=、>>=.
如果用标记符op代表加在“=”之前的运算符,则赋值运算符可表示为“op=”。复合赋值表达式的形式为:
左值表达式op=右值表达式
等效于:左值表达式=左值表达式op右值表达式
2.3.7条件运算符与条件表达式
条件运算符(?:)是c语言中唯一的一个三目运算符,由条件运算符可以构成条件表达式,它的格式为:表达式1?表达式2?表达式3
它的操作过程:表达式1的值,若果为非0值,则求解表达式2的值,并将其作为该条件表达式的值;否则,求解表达式3的值,并将其作为该条件表达式的值。
2.3.8逗号运算符与逗号表达式
逗号运算符是双目运算符,用它可以构成逗号表达式。其结构为:
表达式1,表达式2,表达式3,......,表达式n
运算过程:先求表达式1的值,然后再求表达式2的值,依次计算下去,最后表达式n的值也就是该逗号表达式的值。
2.4 位运算
任何数据在计算机存储器内都是以二进制数的形式存在。
位运算是针对二进制进行的运算。
位运算包括:&(按位与)、|,..^(按位异或)、>>(二进制右移)、<<(二进制左移)、~(按位取反)。
~是单目运算符,其余都是双目运算符。
所有的位运算操作数都必须是整型或字符数据
2.4.1 按位与运算符“&“
按位与运算时对两个数操作数逐位”求与“,当它们都为1时,结果为1,否则为0.

例如:
若a=0x96,b=0x80,则a&b的结果为0x80.
按位与的作用如下:
(1)将某些位清0
(2)取数中的特定位
2.4.2按位或运算符“1”
按位或运算是对两个操作数逐位“相或”
当他们都是0时结果为0,否则为1。
(1)将数的某些位置1
(2)把一串二进制数连接到另一串二进制数后
2.4.3按位异或“..^”
按位异或运算是将两个数逐位相异或,当它们一个为1、一个为0,其相异或的结果为,否则为0.
按位异或的作用:将某些位取反。
注意:一个数异或它本身所得结果为0,和全0异或的结果为它本身,和全1异或相当于本身取反。
2.4.4二进制左移运算符“<<”
二进制左移运算把数据左移若干位,移出左边界的所有为都将丢失,右侧新增加的位0.
例如:Int a=4,a<<2的结果为16
规律:在变量可以表示的范围内,向左移动n位等同于乘上2的n次方。
2.4.5 二进制右移运算符“>>”
二进制右移运算把数据向右移动若干位,移出右边界的所有位都将丢失,左侧新位的补充遵循下面的规则:
1、对于无符号数,右移时左侧的新位一律补0,称为“逻辑右移”。
2、对于有符号数,若符号位是0,则左侧新位一律补0;若符号位是1,则左侧新位一律补1,称为“算术右移”。
例如:变量a是无符号数,a=8,其二进制位:00001000,右移两位且左侧新位一律补0后结果为00000010,所以a>>2的结果为2。
变量b是有符号数,b=-10,其二进制为:11110110。因为符号位为1,所以变量b右移一位且在左侧新位补1后的结果为11111011,所以b>>1的结果为-5.
规律:向右移动一位相当于整除以一个2。
2.4.6按位取反运算符“~”
按位取反运算是将操作数逐位“取反”。
例如:变量a=0x6a,其二进制:
01101010,按位取反后为:10010101,所以~a的结果为:0x95。
2.5运算符的优先级
1 () 圆括号运算符
[] 数组下标
-> 指向结构体成员运算符
. 结构体成员访问运算符 从左向右
2 ++,-- 自增,自减运算符
& 取地址运算符
* 去指针所指内容运算符
! 逻辑非
~ 按位取反
+,- 取正数,取负数
(数据类型) 强制类型转换
sizeof 计算数据类型长度 从右至左
3 *,/,% 乘法,除法,求余
4 +,- 加法,减法
5 <<,>> 左移位,右移位
6 <,<=,>,<= 小于,小于等于
大于,大于等于
7 ==,!= 相等,不相等
8 & 按位与
9 ..^ 按位异或
10 | 按位或
11 && 逻辑与
12 || 逻辑或
13 ?: 条件运

算符
14 =,+=,-=,*=
/=,%=,&=,..^,|=,
<<=,>>= 赋值运算符 从右向左
15 , 逗号运算符 从左向右

2.6 格式化输入/输出函数的进一步讨论
2.6.1 格式化输出函数printf
printf函数格式字符
d 以带符号的十进制形式输出整数(整数不输出符号)
0 以八进制无符号形式输出整数
x,X 以十六进制无符号形式输出整数,用x则输出十六进制数的a~f时以消协形式输出;用X时,则以大写字母输出
u 以无符号十进制形式输出整数
c 以字符形式输出,只输出一个字符
s 输出字符串
f 以小数形式输出单双精度数,隐含输出6位数
e,E 以指数形式输出实数,如用“E”,如用E,则输出时指数以大写“E”表示(如:1.2E+02)
在格式说明中,在%和上述格式字符间可以插入以下几种附加符号(又称修饰符),如表所示:
字母l 用于长整型整数,可加载格式符d,0,,x,u前面
m(代表一个正整数)数据最小宽度
n(代表一个整数) 对实数,表示输出n位小数;对字符串,表示截取字符个数
- 输出数字或字符在域内左靠;无“-”时,在域内向右靠。
下面把它们归纳成3类加以说明:
(1)整数
它包括%d,%0,%x,%u,这里以%d为例加以说明。
1、%d,按整列型数据的实际长度输出。
2、%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格;若大于m,则按实际位数输出。
例如:
printf(“%3d,%3d”,x,y);
若x=321,y=54321,输出结果为:
321,54321
3、%ld,输出长整型数据。
例如:long int x=256790
printf(“%ld”,x);
用%d输出,会发生错误:-32768~32767
(2)字符串
s格式符,用来输出字符串,有以下几种用法。
1、%s
例如:
printf("%s","china");输出“china”字符串
2、%ms
输出字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若传长小于m,则左补以空格。
3、%-ms。
如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
4、%m.ns输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
5、%-m.ns 其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则m自动取n值,即保证n个字符正常输出。
#include "stdio.h"
void main()
{
printf("%3s,%7.2s,%.4s,%-5.3s\n","HUST","HUST","HUST","HUST");
getch();
}
(3)浮点数
f格式符,用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法。
1.%f,不指定字段长度,由系统自动指定,使整数部分全部

如数输出,并输出6位小数。
2、%m.nf指定输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端左端补空格。
3、%-m.nf与%m.nf基本相同,只是输出数值向左端靠,右端补空格。
(未完,待续)





相关主题
相关文档
最新文档