1、C语言基础 进入C,数据类型、运算符与表达式,预备知识: 计算机中数的表示及进制转换 二进制、八进制、十六进制转换成十进制 十进制转换成二进制、八进制、十六进制 二进制与八进制之间的转换 二进制与十六进制之间的转换 数据的单位:位、字节 内存以字节为单位存储数据 每字节内位的编号76543210 数据的表示方式:原码、反码、补码 字符的ASCII表,(计算机)语言的内涵,软件,数据类型,基本类型(4种类型,5个关键字): char int float double void 修饰符(两组): short long signed unsigned 所有修饰符都可以修饰char 和 int,其中l
2、ong还可以修饰double,常用数据类型取值(VC6环境下),不同环境,不同的C语言编译器,各数据类型(主要是int)的长度和取值范围不尽相同浮点数总是不精确的(eg. L2_1.c),几点说明,整数默认是singed 各整数类型均可加修饰符unsinged,表示无符号整数类型。 其中unsigned int 可简写成unsigned 各unsigned类型数据长度不变,表示范围为02n-1(n为数据长度)char 其实也是整数,也可参与数学运算,常量,整型: 一个十进制数是0到9的序列(第一个不能是0)eg:25 -36 16进制应加前缀0x,如0xfa,0xAE03 8进制应加前缀0,如
3、030 类型:默认原则,也可加后缀 后缀L/l 表示long型数据,如30L 后缀U/u 表示unsigned型数据,如13U 实型: 十进制小数法和科学计数法(如:6.83E3,3.94e10) 使用科学计数法时,E/e后面的数绝对不能再含有小数 默认为double型,也可加后缀 后缀F/f表示float型数据,如9.25f 2.5e7f 后缀L/l 表示long double型数据, ,如2.5L,3.6l,常量(续),字符型 用单引号括起来的单个字符,eg: a, 0,% 实际存储的是该字符的ASCII码 如x的ASCII码是120,y的ASCII码是121。对字符变量a,b分别赋予x和
4、y的值,即:char a,b;a=x; b=y;实际上,在内存中是以ASCII码的形式存放的。 a: 01111000 b: 01111001所以也可以把它们看成是整型量。语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型数据按字符型数据输出。eg.L2_2.c,L2_2a.c(大小写字母的转换),转义字符,转义字符的使用。(l2_3.c),字符串,C语言中没有字符串类型 C语言用字符数组来处理字符串 字符串常量是由一对双引号括起的字符序列 如: “CHINA“ ,“C program” , “$12.5“ 字符串常量和字符常量是不同的
5、。主要区别为: 字符常量由单引号括起来,字符串常量由双引号括起来 字符常量只能是单个字符,字符串常量则可以含一个或多个字符 可以把一个字符常量赋给一个字符变量,但不能把一个字符串常量赋给一个字符变量。在语言中没有相应的字符串变量。但是可以用一个字符数组来存放一个字符串常量 字符常量占1个字节的内存空间。字符串常量占的内存字节数等于字符串中字数加1。增加的一个字节中存放字符0 (ASCII码为0)。这是字符串结束的标志,例如: 字符串 “C program“ 在内存中为:,字符常量a和字符串常量“a“虽然都只有一个字符,但在内存中的情况是不同的。 a 在内存中占一个字节,可表示为:,“a “在内
6、存中占二个字节,可表示为:,符号常量,在语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:#define 标识符常量 其中#define是一条预处理命令(预处理命令都以“#“开头),称为宏定义命令,其功能是把该标识符定义为其后的常量值。 习惯上符号常量的标识符用大写字母,变量名用小写字母,以示区别。Eg.符号常量的使用(L2_5.c) 符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。 使用符号常量的好处是: 含义清楚; 能做到“一改全改”。,identifier,我们在程序中起的名字叫标识符identifier(如变量名、函数名
7、等) 标识符由字母、数字或下划线组成,但不能以数字开头 标识符长度不受限制 C是大小写敏感的语言 eg:rate、Rate、RATE 关键字(保留字)不能再被定义为其他事物的名称,变量,变量在使用之前必须声明 eg: int numberOfBeans;double oneWeight,totalWeight; 变量声明必须在代码开始之前 C+中,变量在使用之前的任何地方都可以声明 声明变量: Type Variable_1, Variable_2,;刚声明出来的变量具有随机值,int main(void)short a,b;a=32767;b=a+1;printc(“a:%d, b:%d“,
8、a,b); return 0; 结果为:32767 ,-3276832767: 0111 1111 1111 1111 -32768: 1000 0000 0000 0000,溢出,表达式语句,表达式是变量、常量及运算符的组合。 表达式既可单独组成语句,也可出现在条件测试、变量说明、方法调用的参数等场合 在表达式构件中,运算符起到关键作用。 运算符(实现操作); 运算元(操作对象) 二元运算符、一元运算符、三元运算符,C运算符,一般运算是把运算的量作为一个整体处理,而位运算是把整型数拆开,以位(bit)作为运算对象,优先级与结合性,x+y-2/2+z x+(y-2)/(2+z) 括号优先级最高
9、 记不住优先级就加括号 3+(2*4) 一般来说,同等优先级的二元运算符按从左到右的规则计算(左结合),而同等优先级的一元运算符按从右到左的结合性计算(右结合) 赋值运算符例外,它有右结合性,赋值运算,将右值(rValue)复制给左边(lValue) a=4; b=2+3; c=c+2; rValue可以是任何能生成确定值的东西(常量、变量、表达式) lValue必须是一个明确的、已声明的变量 常量不能做lValue 赋值语句也是一个表达式,它的值为赋给lValue的那个值 赋值运算符具有右结合性: a=b=c=3; eg. L2_6.c,赋值运算(续),合并运算符 二元运算符=,a=b即a=
10、aba+=b a = a + b思考:a*=b+2 ? 计有:+= -= *= /= %= 变量不赋初值就使用是极难查出来的错误(eg. L2_7.c),算术运算,运算符:+ - * / % 运算结果的类型是两个操作数的“最长类型” 如果两个操作数都是整型的,则结果是整型;如果其中有一个或两个是double型的,则结果是double型 eg. L2_8.c 正/负号:+ - - 用来改变数据的符号;+只是用来与 - 对应,它不做任何事情 eg:a=-b;,+和-,它们都是一元运算符;+使变量自增1;-使变量自减1 主要用于整型变量 i+和+i i=1; n=i+; n=+i; - 类似 +和-
11、 只能用于单个变量 (x+y)+ -5等都是非法的 它们用在表达式中容易引起混淆,建议仅将它们作为简单语句来用,关系运算,运算符: = = != 它们用来比较两个数之间的关系,C语言中的逻辑值,C语言没有boolean类型 C语言用“非0”和“0”来表示逻辑值“true”和“false” 当一个量被当做逻辑值使用时,如果该量为0,就被当做false;如果该量不为0,则被当做true当表达式的结果为逻辑值时,如果结果为false,则该表达式的值为0;如果结果为true,则该表达式的值为1 eg. L2_9.c,逻辑运算,运算符:& | ! 短路 eg:(2=3)&(45),位操作,运算符:& |
12、 位运算是把整型数拆开,以位(bit)作为运算对象 eg. L2_10.c,移位运算,运算符: 移位运算只能处理整数 eg: i=53;,三元条件运算,boolean-exp ? value0 : value1; eg: max=ab?a:b;,逗号表达式,可以把几个表达式用逗号连接起来组成一个逗号表达式 eg: a=2,c=5+3,b=b*2; 逗号表达式中的各个部分互不影响 需要用到逗号表达式的唯一场合是for循环,数据类型转换,默认: 短类型 长类型:安全 长类型 短类型:有可能丢失信息强制类型转换例: int a = 2,147,483,647;long b ;double c;b = a ;b+;a = ( int ) b ;c=a/2;,