第二讲 C语言基础.docx

上传人:b****7 文档编号:9730470 上传时间:2023-02-06 格式:DOCX 页数:39 大小:584.67KB
下载 相关 举报
第二讲 C语言基础.docx_第1页
第1页 / 共39页
第二讲 C语言基础.docx_第2页
第2页 / 共39页
第二讲 C语言基础.docx_第3页
第3页 / 共39页
第二讲 C语言基础.docx_第4页
第4页 / 共39页
第二讲 C语言基础.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

第二讲 C语言基础.docx

《第二讲 C语言基础.docx》由会员分享,可在线阅读,更多相关《第二讲 C语言基础.docx(39页珍藏版)》请在冰豆网上搜索。

第二讲 C语言基础.docx

第二讲C语言基础

第2讲C语言的数据类型、运算符及其表达式

2.1C语言的数据类型

1. 基本数据类型

整型、实型、字符型

整型(int):

占用4个字节

实型(float):

占用4个字节

字符型(char):

占用1个字节

例:

#include

voidmain()

{

printf("%d%d%d\n",sizeof(int),sizeof(float),sizeof(char));

}

程序运行后输出:

441

2. 构造数据类型

·数组类型

·结构体类型

·共用体(联合)类型

3. 指针类型

其值用来表示某个变量在内存储器中的地址。

即指针就是地址,地址就是指类型的数。

4.  空类型

有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。

其类型说明符为void。

2.2常量及其类型

2.2.1.常量的概念

常量——在程序中不改变的量,如20、45等。

数值型常量——即数值类型的常量,如123、78.95等。

字符型常量——字符类型的常量,如’a’、’c’、’3’等。

2.2.2常量分类

数值常量——常数。

1.整型常量(整数)

在VC下所用的整数在内存都占用4个字节

十进制常量:

数字

只有数字部分由0123456789的数字组成,无前缀,不能以0开始,没有小数部分,如12、56等

八进制常量:

0+数字部分

以0为前缀,由01234567的数字组成,没有小数部分。

如:

034,075等

十六进制常量:

0x+数字部分

0X+数字部分

以0X或0x为前缀,由0123456789abcdefABCDEF组成,没有小数部分

◇整数可以加后缀:

uU——无符号后缀

lL——长整数后缀

几个long整数常量的格式如下:

/*长十进制常量*/10L、79L

/*长八进制常量*/012L0115L

/*长十六进制常量*/0xaL、0X4fL

/*无符号长十进制常量*/776745UL、778866LU

2.实型常量——浮点数的表示方法

一个“浮点数常量”是一个表示带符号实数的十进制数。

十进制小数形式:

定点数

指数形式:

包括一个整数部分、一个小数部分和一个指数。

整数部分+小数部分+指数部分

指数部分以E或e开头,紧跟一整数,表示E前面的数值乘以10的多少次幂。

15.75

1.575E1/*=15.75*/

1575e-2/*=15.75*/

-2.5e-3/*=-0.0025*/

25E-4/*=0.0025*/

实型常数分类:

单精度(float)4字节

双精度(double)8字节

长精度(longdouble)8字节

◇在VC下,不区分双精确度和长精确度数。

3.字符常量

⑴普通字符常量

字符常量——是由可表示字符集中单个字符由单引号(′′)括起来构成的。

例2.1查看字符的ASCII码值,并用字符参加算术运算。

#include

voidmain()

{

printf("%c:

%d\n",'a','a');

printf("%c:

%d\n",'A','A');

printf("%d\n",'a'+'A');

}

程序运行输出:

a:

97

A:

65

162

转义字符常量

格式:

\ascii字符

这里"\"表示转义,取消字符的原有含义,其后面的字符与”\”一起被处理成一个字符,在内存中占用一个字节。

转义序列表示

\a响铃(警告)

\b退格符(backspace键)

\f换页

\n换行

\r回车

\t水平制表(tab键)

\v垂直制表

\′单引号

\"双引号

\\反向斜杠

\?

文字问号

\0空字符

\nnn八进制表示的ASCII字符

(注:

nnn为三位八进制数=一字符的ascii码值)

\xhh十六进制表示的ASCII字符

(注:

hh为二位十六进制数=一字符的ascii码值)

例1:

查看转义字符的ASCII码值。

#include

voidmain()

{

printf("%s:

%0x\n","\\n",'\n');

printf("%s:

%0x\n","\\t",'\t');

printf("%s:

%0x\n","\\r",'\r');

printf("%c:

%d\n",'\x41','\x41');

printf("%c:

%d\n",'\x42','\x42');

}

例2大小写字母转换。

从上面的例可知,大小写字母的ASCII码值相差32,即:

大写字母的ASCII码值=小写字母的ASCII码值-32

小写字母的ASCII码值=大写字母的ASCII码值+32

#include

voidmain()

{

printf("%c:

%c\n",'A','A'+32);

printf("%c:

%c\n",'b','b'-32);

}

程序运行后输出:

A:

a

b:

B

4.符号常量(文字常量)

符号常量——用标识符来表示一个常量,该常量称为符号常量,在C中用预处理命令#define来定义,如:

#definePI3.14159265

例:

符号常量的使用。

#include

#definepi3.141592625

voidmain()

{

doublex;

x=3*pi;

printf("%f\n",x);

}

5.字符串常量

字符串常量——是用双引号(“”)括起来的字符序列。

字符串常量用于表示以空字符’\0’(ascii码值=0的字符)结尾的字符串的字符序列。

注意:

”a”和’a’代表不同的含义。

例:

”a”和’a’所占用的字节数。

#include

voidmain()

{

printf("%s:

%d\n","a",sizeof("a"));

printf("%c:

%d\n",'a',sizeof((char)'a'));

}

程序运行后输出:

a:

2

a:

1

例:

字符常量的加、减运算。

#include

#include

voidmain()

{

printf("%d\n",'m'+'p'+1);

//printf("%d\n","m"+"p"+1);//错

}

2.3变量及其类型

2.3.1什么是变量

变量

变量具有三个基本要素:

变量名、数据类型、值。

1.变量的名字

变量名是变量所分配的存储单元的符号地址。

C规定标识符只能同字母、数字和下划线组成,且第一个字符必须是字母或下划线。

例如:

sum、average、total、month、Student_name

注意:

变量不能使用系统的关键字(保留字)

2.定义变量

在C中变量必须先定义后使用。

定义格式:

定义格式:

类型变量名[=初值];

类型变量名表;

例:

inta,b,c;

doublex,y,z;

intsize=100;

例:

floata,b,c,d,e;

intn=3,m=5,k=7;

charc1=‘a’,c2=‘b’,c3=‘c’;

注意:

定义的关键是说明变量的类型。

变量存储的数据类型规定该变量在内存中分配的字节数。

3.为变量赋初值

变量的值有两种,一种是存放的数据值,另一种是在内存中所分配的存储单元的地址。

例:

#include

voidmain()

{

intc;

c=7;

printf("%d\n",c);

printf("%d\n",sizeof(c));

printf("%0x\n",&c);

}

运行结果:

7//数据值

4//占用的字节数

12ff7c//分配存储单元的地址值

4.整数在内存中的存储情况

⑴int(基本整型)

在VC下,占用4个字节,最高位为符号位

最高为0,该数为正数,以后各位是该数的值

最高为1,该数为负数,以后各位是该数的补码值

⑵shortint(短整型)

在VC下,占用2个字节,最高位为符号位

最高为0,该数为正数,以后各位是该数的值

最高为1,该数为负数,以后各位是该数的补码值

+7:

0000000000000111

-7:

1111111111111001

⑶longint(长整型)

在VC下,占用4个字节,最高位为符号位

最高为0,该数为正数,以后各位是该数的值

最高为1,该数为负数,以后各位是该数的补码值

⑷无符号型

没有符号位,所有各位均为数值位

例2.1

#include

voidmain()

{

shortintx=-1;

unsignedshorty=x;

printf("%d,%d,%u\n",x,(short)y,y);

}

运行结果:

-1,-1,65535

注意:

不同类型的变量都有其存储数的范围,超过范围,输出的结果是错的。

如:

#include

voidmain()

{

shortintx=32767;

x=x+2;

printf("%d\n",x);

}

程序运行后输出:

x=-32767

若用两个字节的二进制数书写程序中的加法运算:

0111111111111111

+0000000000000010

1000000000000001

两正数相加,得一负数,即-111111111111111的补码,运算溢出。

⑸字符型

在VC下,占用一个字节,存储字符的ASCII码,是0-255的整型数

5.指向基本数据类型的变量的指针变量

◆一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占4个字节,字符量占1个字节等。

◆根据一个内存单元的编号即可准确地找到该内存单元。

内存单元的编号也叫做地址。

◆内存单元的编号或地址址称为指针,这样变量的地址也称为该变量的指针。

⑴变量与指针

◆变量的指针就是变量的地址。

◆在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。

◆一个指针变量的值就是某个变量的地址或称为某变量的指针。

⑵定义指针变量

对指针变量的定义包括三个内容:

①指针类型说明,即定义变量为一个指针变量;

②指针变量名;

③变量值(指针)所指向的变量的数据类型。

其一般形式为:

数据类型符*变量名;

例如:

int*p1;

再如:

int*p2;//p2是指向整型变量的指针变量

float*p3;//p3是指向浮点变量的指针变量

char*p4;//p4是指向字符变量的指针变量

例:

C中指针类型的变量占用4个字节的存储空间,这与指针所指向的数据类型无关,因为存储的都是变量地址类型的数据。

#include

intmain()

{

printf("%d,%d,%d\n",sizeof(int*),sizeof(double*),sizeof(char*));

return0;

}

程序运行后输出:

4,4,4

指针变量的初始化要用变量的地址:

inti=200;

int*pi=&i;

⑶引用指针变量

两个有关的运算符:

1) &:

取地址运算符。

2) *:

指针运算符(或称“间接访问”运算符)。

C语言中提供了地址运算符&来提取变量的地址。

形式为:

&变量名;

如:

&a表示变量a的地址

&b表示变量b的地址。

变量本身必须预先说明。

指针变量的赋值

指针变量名=&变量名;

(1)指针变量初始化的方法

inta;int*p=&a;

(2)赋值语句的方法

inta;int*p;p=&a;

通过指针变量访问所指向的变量

*指针变量名

例:

可以通过指针变量ip间接访问变量i,例如:

    x=*ip;

例:

改变指针变量的地址值。

设:

inti,j,*p1,*p2;

 i='a';

 j='b';

p1=&i;

p2=&j;

如执行赋值操作:

p2=p1;

如果执行操作:

*p2=*p1;//等价于执行”j=i;”

◆指针变量可出现在表达式中。

设:

intx,y,*px=&x;

指针变量px指向整数x,则*px可出现在x能出现的任何地方。

例如:

y=*px+5; //表示把x的内容加5并赋给y

y=++*px; //++*px相当于++(*px)

y=*px++; //*相当于y=*px;px++

2.4运算符和表达式

2.4.1C运算符简介

⑴算术运算符

用于各类数值运算。

包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。

⑵关系运算符

用于比较运算。

包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!

=)六种。

⑶逻辑运算符

用于逻辑运算。

包括与(&&)、或(||)、非(!

)三种。

⑷位操作运算符

参与运算的量,按二进制位进行运算。

包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。

⑸赋值运算符

用于赋值运算,分为:

简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。

⑹条件运算符

这是一个三目运算符,用于条件求值(?

:

)。

⑺逗号运算符

用于把若干表达式组合成一个表达式(,)。

⑻指针运算符

用于取内容(*)和取地址(&)二种运算。

⑼求字节数运算符

用于计算数据类型所占的字节数(sizeof)。

⑽强制类型转换运算符

用于数据类型的转换((类型))。

⑾成员运行符——分量运算符

用于对象引用其成员(.)。

⑿指向成员运算符——分量运算符

用于通过指向对象的指针访问对象中的成员(->)。

⒀下标运算符

用于通过索引号引用数组中的元素([])。

⒁函数调用算符——圆括号运算符

用于说明该标识符为函数并提供参数表(())。

例:

#include

voidmain()

{

printf("%d%d%d\n",20%7,-20%7,20%-7);

}

程序运行后输出:

6-66

输出都是余数。

2.4.4各类数值型数据之间的混合运算

变量的数据类型是可以转换的。

转换的方法有两种,一种是自动转换,一种是强制转换。

1.自动转换遵循以下规则

1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

2)转换按数据长度(占用的字节数)增加的方向进行,以保证精度不降低。

3)值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。

如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。

下图表示了类型自动转换的规则。

 

例:

#include

voidmain()

{

floatPI=3.14159f,ss;

ints,r=5;

ss=r*r*PI;

s=r*r*PI;

printf("s=%d\n",s);

printf("ss=%f\n",ss);

}

程序运行后输出:

s=78

ss=78.539749

2.强制类型转换

格式:

(数据类型)表达式

功能:

返回指数据类型的表达式值

例:

#include

voidmain()

{

inti=100,j=40;

floatf,ff;

f=i/j;

ff=(float)i/j;//强制转换

printf("f=%f\n",f);

printf("ff=%f\n",ff);

}

运行结果:

f=2.000000

ff=2.500000

2.4.5自增和自减运算符

自增1运算符记为“++”,其功能是使变量的值自增1。

自减1运算符记为“--”,其功能是使变量值自减1。

自增1,自减1运算符均为单目运算,都具有右结合性。

可有以下几种形式:

++ii自增1后再参与其它运算。

--ii自减1后再参与其它运算。

i++i参与运算后,i的值再自增1。

i--i参与运算后,i的值再自减1。

注意:

++和--运算只能用于变量,而不能用于常量和表达式。

如5++和(a+b)++都是不合法的。

⑵++和--运算的结合方向是“自右至左”,即按右结合进行运算。

例:

#include

voidmain()

{

inti=3;

inta=-i++;

printf("a=%di=%i\n",a,i);

}

程序运行后输出:

a=-3i=4

结果说明:

程序先执行“a=-i”,后执行”i++”,而不是”(-i)++”,不能对表达式(-i)进行++运算。

例:

#include

voidmain()

{

inti=8;

printf("%d",++i);

printf("%d\n",i);

printf("%d",--i);

printf("%d\n",i);

printf("%d",i++);

printf("%d\n",i);

printf("%d",i--);

printf("%d\n",i);

printf("%d",-i++);

printf("%d\n",i);

printf("%d",-i--);

printf("%d\n",i);

}

例:

#include

voidmain()

{

inti=5,j=5,p,q;

p=(i++)+(i++)+(i++);

q=(++j)+(++j)+(++j);

printf("%d%d%d%d\n",p,q,i,j);

}

2.4.6赋值运算符与赋值表达式

1.赋值运算符

一个赋值运算把右边操作数的值赋给左边操作数命名的存储位置。

因此,一个赋值运算的左边操作数必须是可修改的L(左值)。

如:

a=3;

a=a+2;

◇L(左)值和R(右)值表达式的概念

L值——指的是存储器位置的表达式称为“L值”表达式。

R值——用于描述一个表达式的值,

所有的L值都是R值,但R值不都是L值。

如:

i=7;//正确变量名i是一个L值

7=i;//错误常量7是一个R值

j*4=7;//错误表达式j*4产生一个R值

constintci=7;//说明一个const变量(只读变量)

ci=9//错,ci是不可修改的l值

((i<3)?

i:

j)=7;//错,条件运算返回的是变量的值

2.赋值过程中的类型转换

赋值转换:

当左值类型与右值类型不一致时,系统强制把右值转换为左值的类型,并在赋值发生后把该值存储在左边操作数中。

#include

voidmain()

{

inti=5.75;

printf("i=%d\n",i);

}

程序运行后输出:

i=5

例:

#include

voidmain()

{

floatf=5;doubleff=5;

}

单步运行可观察到两浮点变量存储的值:

例:

#include

voidmain()

{

floatf=5;

doubled=123.456789e100;

f=d;//溢出,f没有能存储正确的值

}

单步运行:

#include

voidmain()

{

intc='a';

printf("c=%d\n",c);

}

程序运行后输出:

c=97

例:

#include

voidmain()

{

inti=0x7fffff4a;

shorts=0x7f4a;

longl=0x7fffff4a;

charc1=i;charc2=s;charc3=l;

}

单步运行程序:

例:

将有符号数据传送给无符号变量。

#include

voidmain()

{

shortb=-1;

unsignedshorta=b;

printf("%d%0x\n",a,a);

printf("%d%0x\n",b,b);

}

程序运行后输出:

65535ffff//高位的0没有显示

-1ffffffff//按int型显示

3.复合的赋值运算

复合赋值运算符组合简单赋值运算符和其它双目运算符。

expression1+=expression2

可以理解为

expression1=expression1+expression2

一个复合赋值运算符的操作数必须是整数或浮点类型。

复合赋值运算符:

*=乘法赋值

/=除法赋值

%=余数赋值

+=加法赋值

-=减法赋值

<<=左位移赋值

>>=右位移赋值

&=按位与(AND)赋值

^=按位异或(XOR)赋值

|+按位或(OR)赋值

例:

#include

main()

{

inta=5;

intb=5;

a*=2;

b+=5;

printf("%d%d\n",a,b);

a^=b;

printf("%d%d\n",a,b);

return1;

}

程序运行后输出:

1010

010

4.赋值表达式

赋值运算符构成的“变量名=表达式”结构是一个表达式,称为赋值表达式,其“运算”结果为向左边的变量所赋的值。

#include

voidmain()

{

inta=0;

intb=5;

printf("%d%d\n",a,a=b);

}

程序运行后输出:

55

注意:

在printf函数的表达式表中,计算顺序是自右至左。

⑴赋值运算是“自右而左”的结合顺序,即在程序中可以连续用一个数据对多个变量赋值:

”a=b=c=5;”,等价于”a=(b=(c=5));”:

#include

voidmain()

{

inta,b,c;

a=b=c=5;

printf("%d%d%d\n",a,b,c);

a=(b=(c=10));

printf("%d%d%d\n",a,b,c);

}

程序运行后输出:

555

101010

⑵赋值表达式可以包含复合赋值运算符。

#include

voidmain()

{

inta=5,b=5;

a+=a-=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1