c语言数据运算
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
011
3. 逻辑运算符
运算符 ! && ||
功能 逻辑非 逻辑与 逻辑或
优先级 结合性 自右向左 自左向右 自左向右
p q p&&q P||q !p
00
0
0
1
01
0
1
1
10
0
1
0
11
1
1
0
4. 逻辑表达式
用逻辑运算符连接关系表达式或任意数值型表达式。
char ch=‘a’; int x=5;
ch>=‘A’&&ch<=‘Z’||ch>=‘a’&&ch<=‘z’
如(int)x不能写成int x。 (2)在对一个表达式进行强制类型转换时,整个表达式也应该
用括号括住。例如,(float)(a+b)若写成(float)a+b就只对 变量a进行了强制类型转换。 (3)在对变量或表达式进行了强制类型转换后,并不改变原变 量或表达式的类型。例如,设x为float型,y为double型, 则(int)(x+y)为int型,而x+y仍然是double型。 (4)将float型或double型强制转换成int型时,对小数部分是四 舍五入还是简单地截断,取决于具体的系统。VC++采用 的是截断小数的办法。
第 3 章 数据运算
计算机的基本功能是进行数据处理,而数据处 理主要是通过对表达式的计算完成的。
表达式是将运算量用运算符连接起来组成的式 子,其中运算量可以是常量、变量或函数。
由于运算量划分为不同的数据类型,每一种数 据类型都规定了自己特有的运算或操作,这就形成 了对应于不同数据类型的运算符集合及其相应的求 值规则。
3.1 算术运算
1. 算术运算符
运算符
功能
说明
+ - ++ -*/%
+-
正负号、自加、自减 乘、除、求余数 加、减
一元运算符 二元运算符 二元运算符
必须连接两个运算量的运算符称为二元运算符 a+b a%b a/b
只连接一个运算量的运算符称为一元运算符 -a a++ --b
2. 算术表达式
用算术运算符连接数值型的运算量而得到的式子。 -5*3+6%4/2-1 (a+b)/(a-b) a+(b++)*c
c=2.5; // 高精度转换成低精度 b=c; // 高精度转换成低精度 a=b; // 低精度转换成高精度 printf("%d,%d,%.1f",a,b,c); }
2,2,2.5
#include <stdio.h> void main() { int a=-1;
unsigned int b; b=a; // 低精度转换成高精度 printf("%d %u\n",a,b); }
【例3-9】关系表达式的计算。
#include <stdio.h> void main()
{ int x=8,y,z; y=z=x++; printf("%d ",(x>y)==(z=x-1)); x=y==z; printf("%d ",x); printf("%d\n",x++>=++y-z--);
││││ ││ ││ ││
└┬┘ └┬┘ └┬┘ └┬┘ └┬┘
④
⑤
①
②
③
long │ double
│
│
└─┬─┘
└──┬─┘
double
⑧
⑥
│
double
└──-─┬──┘
│
⑦
└─────┬──────-─┘
⑨
(3)强制类型转换规则
当算术表达式中需要违反自动类型转换规则,或者说 自动类型转换规则达不到目的时,可以使用强制类型转换, 其格式为:
自右向左
* / % 乘、除、求余
自左向右
+ - 加、减
低
自左向右
-++i -i++ 5*6%4/3 a+b-c ③ 用圆括号可以提高某个运算符的优先级或结合性,但不允
许使用方括号或花括号。
x+y*s-a+4/5*32与(x+(y*(s-a)+4)/5)*32
-++i -i++ 5*6%4/3 a+b-c ③ 用圆括号可以提高某个运算符的优先级或结合性, 但不允许使用方括号或花括号。 x+y*s-a+4/5*32与(x+(y*(s-a)+4)/5)*32
38.500000
表达式ch/i+i*k-(j+k)*(f*d)/(f+i)中含有多种类型的变量,根 据优先级和结合性规则及自动类型转换规则进行计算,计算过程 如图所示。
ch /i + i * k -( j + k )*( f * d )/( f + i )
││││ ││ ││ ││
int │ long │ long │ double│ double double
wk.baidu.com
【例3-2】 算术表达式计算优先级和结合性规则。
#include <stdio.h> void main() { int a=3,b=5,c=15,d=2; printf("%d\n",6-a*b/c%d); printf("%d\n",++a-a++); printf("%d\n",a); }
(2)自动类型转换规则
(1)求余运算的规则 假设两个整数分别为a和b,则a%b=a-a/b*b 8%3=2,-8%3=-2,8%(-3)=2 -8%(-3)=-2
(2)自加(加1)自减(减1)运算 ++i 表示i=i+1 --i 表示i=i-1
① ++或- -可以用于前缀,也可以用于后缀。 ++n 表示先令n=n+1,然后取n的值 //先运算后取值 n++ 表示先取n的值,然后令n=n+1 //先取值后运算
100
//前缀 101 101
//后缀 100
3. 算术表达式求值规则
(1)算术运算符的优先级和结合性 ①优先级:不同的运算符同时出现在表达式中时,进行运算
的优先次序
②结合性:同一优先级的运算符同时出现在同一表达式中时,
进行运算的顺序
运算符
功能
优先级 结合性
+ - ++ -- 正、负号 自加 、自减 高
for(i=0,j=0;i<8,j<10;i++,j++) 中的三个语法位置:循环变量赋初值、循环终止条件判断和循环变 量增值都只允许一个表达式,用逗号表达式可实现两个或多个表达 式的运算。
3.4 关系运算和逻辑运算
1. 关系运算符
运算符
>、 <、 >= <= == 、!=
功能
大于、小于、大于等 于、小于等于
2.500000 1 VC++对高精度类型转换乘低精度类型增强了检查能力, 因此,对float型变量用double型常数初始化将给出警告。
3.2 赋值运算
1. 赋值运算符“=”和赋值表达式 v=e; // 赋值语句 v=e // 赋值表达式
赋值运算符:
+= -= *= /= %=
<<= >>= &= |= ^=
a=3*5,a*4,a+5;
t=a,a=b,b=t; 2. 逗号表达式的值
逗号表达式中最右边的一个表达式的值视为逗号表达式的值。
int a=5; a=3*5,a*4,a+5
// 该逗号表达式的值=?
int a=5; a=(3*5,a*4,a+5)
// 该赋值表达式的值=?
【例3-8】逗号运算符及逗号表达式。 #include <stdio.h> void main() { int c=5; printf("%d,%d,%d\n",c+=c++,c+8,++c); c=5; printf("%d\n",(c+=c++,c+8,++c)); c=5; printf("%d\n",c+=c++,c+8,++c); }
x=x+1; a=a-1; c=c*(2+x);
x+=1; a-=1; c*=2+x;
前五种复合赋值运算符具有算术运算和赋值的双重功 能;后五种复合赋值运算符则具有位运算和赋值的双重功 能。
2. 赋值表达式的值和类型 在赋值表达式中,被赋值的变量得到的值就是赋值表达
式的值,而被赋值的变量的类型就是赋值表达式的类型。 例如,在形如
1
逻辑表达式的特殊计算问题 ① 形如(表达式1)&&(表达式2)&&…的逻辑表达式
计算到第一个为逻辑假的表达式,就可判定整个逻辑表达式为 逻辑假,其后的表达式将不被计算。 ② 形如(表达式1)||(表达式2)||…的逻辑表达式时 计算到第一个为逻辑“真”的表达式,就可判定整个逻辑表达 式为逻辑“真”,其后的表达式将不被计算。
3. 逗号表达式的应用
(1)用一个逗号表达式语句可代替多个赋值语句,如 a=0;b=1;c=2; 可写成 a=0,b=1,c=2;
(2)用一个逗号表达式语句可得到多个计算结果,如 y=10; x=(y=y-5,60/y);
执行后,x的值为12,y的值为5。 (3)当某些语法位置只允许出现一个表达式时,用逗号表达式可 实现多个表达式的运算,例如后面要介绍的for循环:
-1 4294967295
【例3-7】复合赋值运算符和赋值表达式作为运算量。 #include <stdio.h> void main() { int a=12; a+=a-=a*a; // 赋值表达式作为运算量 printf("3 %d\n",a); }
运行结果 -264
3.3 逗号运算
1. 逗号运算符(顺序运算符) 用逗号运算符将几个表达式连接在一起就构成逗号表达式。
等于 不等于
优先级
结合性 自左向右
自左向右
2. 关系表达式
(1)用一个关系运算符连接两个算术或赋值表达式 a+b>=c-d x==y score>90
(2)用“==”或“!=”连接两个关系表达式 x>y!=y<z a+b==c+d
关系表达式的值是一个逻辑值:逻辑真和逻辑假。 逻辑真:1 printf(“%d”,32!=25); 逻辑假:0 printf(“%d”,25==32);
② 如果前缀或后缀运算形成一条语句,其运算结果是相 同的。例如,设 i=5,则
i++; 及
++i; 运算后,i的值均为6。
【例3-1】加1和减1运算。 #include <stdio.h> void main() { int a=100; printf("%d\n",a); printf("%d\n",++a); printf("%d\n",a--); printf("%d\n",a); }
x>=0&&x<=10 //10>=x>=0
25&&-3 其值得1
0||356
其值得1
!(-23) 其值得0
【例3-10】逻辑表达式的计算和逻辑表达式的值。 #include <stdio.h> #define EOF 1 void main() { int a=3,b=4,c=5; printf("%d\n",3*(a+b)>c&&a++||c!=0&&!EOF); }
① C编绎系统先将所有的char和short int都转换成int,所有 的float都转换成double。
② 如果表达式中只含同类型的运算量,则直接进行运算, 运算结果即表达式的值也是同类型的。 3/2 值为1(整型) 3.0/2.0 值为1.5(双精度型) ‘A’+’B’ 值 为131(int)型
【例3-4】算术表达式计算强制类型转换规则。 #include <stdio.h> void main() { int a=7,x=3,y=2; float b=2.5F,c=4.7F,z=3.5F; printf("%f\n",b+a%3*(int)(b+c)%2/4); printf("%d\n",(x+y)%2+(int)b/(int)z); }
③ 如果表达式中含有不同运算类型的运算量,先将精度较 低的运算量转化成精度较高的类型,再与精度较高的运 算量进行运算,得到的运算结果为精度较高的类型。
【例3-3】 算术表达式计算自动类型转换规则
#include <stdio.h> void main()
{ char ch='a'; int i=5; unsigned int j=6; long int k=12; float f=3.0; double d=6.0; printf(“%lf\n”,ch/i+i*k-(j+k)*(f*d)/(f+i)); }
v=e 的赋值表达式中,变量v的值就是该赋值表达式的值,变量v 的类型也就是赋值表达式的类型。
3. 赋值表达式中的数据类型转换 在v=e这样的赋值表达式中,当v和e的数据类型不一致时,C
编译系统自动将e的类型转换成与v相同的类型后再赋值。 【例3.5~3.6】 赋值表达式中的数据类型转换。
#include <stdio.h> void main() { int a; char b; float c;
(类型关键字)(表达式) (double)a 强制将变量a转换成double型 (int)(x+y) 强制将表达式(x+y)的值转换成int型 (int)x+y 强制将变量x转换成int型,然后与y相加 其中包围类型关键字的圆括号必不可少。
使用强制应注意以下几点: (1)在进行强制类型转换时,类型关键字必须用括号括住。例
011
3. 逻辑运算符
运算符 ! && ||
功能 逻辑非 逻辑与 逻辑或
优先级 结合性 自右向左 自左向右 自左向右
p q p&&q P||q !p
00
0
0
1
01
0
1
1
10
0
1
0
11
1
1
0
4. 逻辑表达式
用逻辑运算符连接关系表达式或任意数值型表达式。
char ch=‘a’; int x=5;
ch>=‘A’&&ch<=‘Z’||ch>=‘a’&&ch<=‘z’
如(int)x不能写成int x。 (2)在对一个表达式进行强制类型转换时,整个表达式也应该
用括号括住。例如,(float)(a+b)若写成(float)a+b就只对 变量a进行了强制类型转换。 (3)在对变量或表达式进行了强制类型转换后,并不改变原变 量或表达式的类型。例如,设x为float型,y为double型, 则(int)(x+y)为int型,而x+y仍然是double型。 (4)将float型或double型强制转换成int型时,对小数部分是四 舍五入还是简单地截断,取决于具体的系统。VC++采用 的是截断小数的办法。
第 3 章 数据运算
计算机的基本功能是进行数据处理,而数据处 理主要是通过对表达式的计算完成的。
表达式是将运算量用运算符连接起来组成的式 子,其中运算量可以是常量、变量或函数。
由于运算量划分为不同的数据类型,每一种数 据类型都规定了自己特有的运算或操作,这就形成 了对应于不同数据类型的运算符集合及其相应的求 值规则。
3.1 算术运算
1. 算术运算符
运算符
功能
说明
+ - ++ -*/%
+-
正负号、自加、自减 乘、除、求余数 加、减
一元运算符 二元运算符 二元运算符
必须连接两个运算量的运算符称为二元运算符 a+b a%b a/b
只连接一个运算量的运算符称为一元运算符 -a a++ --b
2. 算术表达式
用算术运算符连接数值型的运算量而得到的式子。 -5*3+6%4/2-1 (a+b)/(a-b) a+(b++)*c
c=2.5; // 高精度转换成低精度 b=c; // 高精度转换成低精度 a=b; // 低精度转换成高精度 printf("%d,%d,%.1f",a,b,c); }
2,2,2.5
#include <stdio.h> void main() { int a=-1;
unsigned int b; b=a; // 低精度转换成高精度 printf("%d %u\n",a,b); }
【例3-9】关系表达式的计算。
#include <stdio.h> void main()
{ int x=8,y,z; y=z=x++; printf("%d ",(x>y)==(z=x-1)); x=y==z; printf("%d ",x); printf("%d\n",x++>=++y-z--);
││││ ││ ││ ││
└┬┘ └┬┘ └┬┘ └┬┘ └┬┘
④
⑤
①
②
③
long │ double
│
│
└─┬─┘
└──┬─┘
double
⑧
⑥
│
double
└──-─┬──┘
│
⑦
└─────┬──────-─┘
⑨
(3)强制类型转换规则
当算术表达式中需要违反自动类型转换规则,或者说 自动类型转换规则达不到目的时,可以使用强制类型转换, 其格式为:
自右向左
* / % 乘、除、求余
自左向右
+ - 加、减
低
自左向右
-++i -i++ 5*6%4/3 a+b-c ③ 用圆括号可以提高某个运算符的优先级或结合性,但不允
许使用方括号或花括号。
x+y*s-a+4/5*32与(x+(y*(s-a)+4)/5)*32
-++i -i++ 5*6%4/3 a+b-c ③ 用圆括号可以提高某个运算符的优先级或结合性, 但不允许使用方括号或花括号。 x+y*s-a+4/5*32与(x+(y*(s-a)+4)/5)*32
38.500000
表达式ch/i+i*k-(j+k)*(f*d)/(f+i)中含有多种类型的变量,根 据优先级和结合性规则及自动类型转换规则进行计算,计算过程 如图所示。
ch /i + i * k -( j + k )*( f * d )/( f + i )
││││ ││ ││ ││
int │ long │ long │ double│ double double
wk.baidu.com
【例3-2】 算术表达式计算优先级和结合性规则。
#include <stdio.h> void main() { int a=3,b=5,c=15,d=2; printf("%d\n",6-a*b/c%d); printf("%d\n",++a-a++); printf("%d\n",a); }
(2)自动类型转换规则
(1)求余运算的规则 假设两个整数分别为a和b,则a%b=a-a/b*b 8%3=2,-8%3=-2,8%(-3)=2 -8%(-3)=-2
(2)自加(加1)自减(减1)运算 ++i 表示i=i+1 --i 表示i=i-1
① ++或- -可以用于前缀,也可以用于后缀。 ++n 表示先令n=n+1,然后取n的值 //先运算后取值 n++ 表示先取n的值,然后令n=n+1 //先取值后运算
100
//前缀 101 101
//后缀 100
3. 算术表达式求值规则
(1)算术运算符的优先级和结合性 ①优先级:不同的运算符同时出现在表达式中时,进行运算
的优先次序
②结合性:同一优先级的运算符同时出现在同一表达式中时,
进行运算的顺序
运算符
功能
优先级 结合性
+ - ++ -- 正、负号 自加 、自减 高
for(i=0,j=0;i<8,j<10;i++,j++) 中的三个语法位置:循环变量赋初值、循环终止条件判断和循环变 量增值都只允许一个表达式,用逗号表达式可实现两个或多个表达 式的运算。
3.4 关系运算和逻辑运算
1. 关系运算符
运算符
>、 <、 >= <= == 、!=
功能
大于、小于、大于等 于、小于等于
2.500000 1 VC++对高精度类型转换乘低精度类型增强了检查能力, 因此,对float型变量用double型常数初始化将给出警告。
3.2 赋值运算
1. 赋值运算符“=”和赋值表达式 v=e; // 赋值语句 v=e // 赋值表达式
赋值运算符:
+= -= *= /= %=
<<= >>= &= |= ^=
a=3*5,a*4,a+5;
t=a,a=b,b=t; 2. 逗号表达式的值
逗号表达式中最右边的一个表达式的值视为逗号表达式的值。
int a=5; a=3*5,a*4,a+5
// 该逗号表达式的值=?
int a=5; a=(3*5,a*4,a+5)
// 该赋值表达式的值=?
【例3-8】逗号运算符及逗号表达式。 #include <stdio.h> void main() { int c=5; printf("%d,%d,%d\n",c+=c++,c+8,++c); c=5; printf("%d\n",(c+=c++,c+8,++c)); c=5; printf("%d\n",c+=c++,c+8,++c); }
x=x+1; a=a-1; c=c*(2+x);
x+=1; a-=1; c*=2+x;
前五种复合赋值运算符具有算术运算和赋值的双重功 能;后五种复合赋值运算符则具有位运算和赋值的双重功 能。
2. 赋值表达式的值和类型 在赋值表达式中,被赋值的变量得到的值就是赋值表达
式的值,而被赋值的变量的类型就是赋值表达式的类型。 例如,在形如
1
逻辑表达式的特殊计算问题 ① 形如(表达式1)&&(表达式2)&&…的逻辑表达式
计算到第一个为逻辑假的表达式,就可判定整个逻辑表达式为 逻辑假,其后的表达式将不被计算。 ② 形如(表达式1)||(表达式2)||…的逻辑表达式时 计算到第一个为逻辑“真”的表达式,就可判定整个逻辑表达 式为逻辑“真”,其后的表达式将不被计算。
3. 逗号表达式的应用
(1)用一个逗号表达式语句可代替多个赋值语句,如 a=0;b=1;c=2; 可写成 a=0,b=1,c=2;
(2)用一个逗号表达式语句可得到多个计算结果,如 y=10; x=(y=y-5,60/y);
执行后,x的值为12,y的值为5。 (3)当某些语法位置只允许出现一个表达式时,用逗号表达式可 实现多个表达式的运算,例如后面要介绍的for循环:
-1 4294967295
【例3-7】复合赋值运算符和赋值表达式作为运算量。 #include <stdio.h> void main() { int a=12; a+=a-=a*a; // 赋值表达式作为运算量 printf("3 %d\n",a); }
运行结果 -264
3.3 逗号运算
1. 逗号运算符(顺序运算符) 用逗号运算符将几个表达式连接在一起就构成逗号表达式。
等于 不等于
优先级
结合性 自左向右
自左向右
2. 关系表达式
(1)用一个关系运算符连接两个算术或赋值表达式 a+b>=c-d x==y score>90
(2)用“==”或“!=”连接两个关系表达式 x>y!=y<z a+b==c+d
关系表达式的值是一个逻辑值:逻辑真和逻辑假。 逻辑真:1 printf(“%d”,32!=25); 逻辑假:0 printf(“%d”,25==32);
② 如果前缀或后缀运算形成一条语句,其运算结果是相 同的。例如,设 i=5,则
i++; 及
++i; 运算后,i的值均为6。
【例3-1】加1和减1运算。 #include <stdio.h> void main() { int a=100; printf("%d\n",a); printf("%d\n",++a); printf("%d\n",a--); printf("%d\n",a); }
x>=0&&x<=10 //10>=x>=0
25&&-3 其值得1
0||356
其值得1
!(-23) 其值得0
【例3-10】逻辑表达式的计算和逻辑表达式的值。 #include <stdio.h> #define EOF 1 void main() { int a=3,b=4,c=5; printf("%d\n",3*(a+b)>c&&a++||c!=0&&!EOF); }
① C编绎系统先将所有的char和short int都转换成int,所有 的float都转换成double。
② 如果表达式中只含同类型的运算量,则直接进行运算, 运算结果即表达式的值也是同类型的。 3/2 值为1(整型) 3.0/2.0 值为1.5(双精度型) ‘A’+’B’ 值 为131(int)型
【例3-4】算术表达式计算强制类型转换规则。 #include <stdio.h> void main() { int a=7,x=3,y=2; float b=2.5F,c=4.7F,z=3.5F; printf("%f\n",b+a%3*(int)(b+c)%2/4); printf("%d\n",(x+y)%2+(int)b/(int)z); }
③ 如果表达式中含有不同运算类型的运算量,先将精度较 低的运算量转化成精度较高的类型,再与精度较高的运 算量进行运算,得到的运算结果为精度较高的类型。
【例3-3】 算术表达式计算自动类型转换规则
#include <stdio.h> void main()
{ char ch='a'; int i=5; unsigned int j=6; long int k=12; float f=3.0; double d=6.0; printf(“%lf\n”,ch/i+i*k-(j+k)*(f*d)/(f+i)); }
v=e 的赋值表达式中,变量v的值就是该赋值表达式的值,变量v 的类型也就是赋值表达式的类型。
3. 赋值表达式中的数据类型转换 在v=e这样的赋值表达式中,当v和e的数据类型不一致时,C
编译系统自动将e的类型转换成与v相同的类型后再赋值。 【例3.5~3.6】 赋值表达式中的数据类型转换。
#include <stdio.h> void main() { int a; char b; float c;
(类型关键字)(表达式) (double)a 强制将变量a转换成double型 (int)(x+y) 强制将表达式(x+y)的值转换成int型 (int)x+y 强制将变量x转换成int型,然后与y相加 其中包围类型关键字的圆括号必不可少。
使用强制应注意以下几点: (1)在进行强制类型转换时,类型关键字必须用括号括住。例