C语言中级培训教程—何谓表达式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中级培训
“表达式”的概念
ALU的构造决定了它只能进行二元运算。
那么一个复杂表达式的多次计算如何处理?
只好按优先级和结合性一点一点地做。
这就产生了“中间结果”,暂存在哪里?只有内存。
内存里会有一些无名的、占一定空间的、短命的变量存在,它们稍纵即逝,由系统来管理。
它们就叫做表达式的值。
“表达式的值”的特点
用于临时存放计算结果,如同变量;
任何表达式都有值;
表达式的值都没有名字;
它们是短命的——语句结束(;)即被自动释放;它们被临时存放在函数运行栈中;
尽管昙花一现,但它们存在过。
正是它们的存在才为复杂表达式的运算建立了联系的纽带。
“表达式”的概念
例如:X = a + b * c –d ;
运算过程为:b * c暂存于“暂1”,a + “暂1”
暂存于“暂2”,“暂2”–d暂存于“暂3”
,X = “暂3”暂存于“暂4”,然后全部释放。
表达式和基本语句
“函数调用表达式”
自增、自减运算符(前置、后置)
++
a
i4
34
++
b
j4
33
2
23 2错错
1
x = -1y =-1
printf("x = %d\ny = %d\n",x,y);
后置运算符到底后到哪?
既然”后置”是参照另一个操作动作而言,若有多个动作出现,后置到底”后”到什么程度?
int i =3, j;
j=i++ + i++ ;
printf(“%d,%d\n”,i,j);
(j)
运行后i,j的值:5,6 因为i++ 要等到加之后做,故j 6(不是7),i由3增到5。
j=6(
但对于复合运算符+=、-=、*=、/=、%=不适用。
比如int x = 10;x -=x--; 结果为-1。
因为该式要马上使用int x=10;x-=x--;
x,x必须有个确切值,相当于y = x--; 此时y为10,x x=x y;9101
为9。
x=x-y;就是9-10 所以为-1
结论:后置运算要”后”到本语句的其它动作之最后。
逻辑表达式的特点:
使用逻辑表达式需要注意:
&&和||不一定会执行全部计算,所以不要在&&和||表达式中进行函数调用或赋值:
if ( (a > 0) && ((b = f(a)) < 0))
// 如果a<=0,那么b=f(a)不会被执行;
(()||((())))
if( (a > 0) || ((b = f(a)) < 0))
// 如果a>0,那么b=f(a)也不会被执行;
?:表达式也不会执行全部计算,所以在这个表达式中也不要进行函数调用和赋值:
( a > b )? c = a : b; // a<=b的时候c=a不会被执行。
左值和右值
可作左值的表达式
不要进行有符号和无符号数比较
// b > a 不为真,为什么
#include <stdio.h>
int array[] = {23,56,6,33,12,63,2,14,7}; //9个元素
//9-2本应该是大于-1的,但是…
i<=TOT_ELES-2//为假,sizeof()的返回类型为unsigned
此句没执行
不要进行布尔变量与零值比较
不可将布尔量直接与TRUE、FALSE或者1、0进行比较
if (flag)// 表示flag为真
if(!fl)//fl
if (!flag)// 表示flag为假
指针变量与零值比较
不要进行浮点变量与零值比较
不可将浮点变量用“==”或“!=”与任何数字比较。
(()())
if ((x>=-EPSINON) && (x<=EPSINON))
提倡用整型变量与零值比较
应提倡将整型变量用"=="或"!="直接与0比较。
以下代码存在什么问题?
for( i = 0; i < total; i++)//请注意i和total的类型
total;i++)
array[ i ] = 0xFF;
total的取值可能比i大
得多,当i的值增加到边
界时仍然小于total,i已
经变成负的
讲解:
整数存在溢出问题
求字节运算符sizeof的用处:
次序运算符:,
var1=ary[cnt1],ary[cnt1]=ary[cnt2];
t1]
除for语句外,禁止使用,运算符。
类型转换表达式
算术运算中的类型转换
char ch;
int i;
int i;
float f;
double d ,result;
double d
result =( ch / i ) + ( f * d ) -( f + i );
int double double
double
double
char ch=a,result;
char ch‘a’
int i = 10;
float f = 3.44f;
fl f344f
double d = 0.22;
result =( ch || i ) + ( f && d );
注意:对(ch || i )和(f && d)若用printf()函数
%d%f
显示表达式的值,定要用%d ,否则%f 会使结果为0.0000000。
;;; char ch = ‘a’;int i = 100;float f = 3.44f; double d = 0.22;
ch = i ;
ch=i ;
f = d ;
printf( “ ch = %c\n”, ch );//d
printf( " ch = %d\n", ch ); // 100
printf( " f = %f\n", f ); // 0.220000
printf( d %lf\n, d ); // 0.220000
printf("d=%lf\n"d);//0220000
条件运算中的类型转换
char ch = ‘a’;int i = 10;float f = 3.44f; double d = 0.22,result;
double d=022
result=(ch > i )? f : d;
此时f 和d 类型不相同(第一表达式的类型不在其内),则f 服从d。
至于result的类型是否与之相符,则完全遵循“赋值运算类型转换”的原则。
函数调用的形实结合时的类型转换
函数的返回类型的转换
()
int fun ( )
{
char ch = a;int i = 100;float f = 3.44f; char ch=‘a’;int i=100;float f=344f; double d = 0.22;
…
return ch+i*f-d;
}
由转换产生的临时变量所引发的问题
请解释原因!
因为int( d )
()是强制类型转换运算,它要产生一个短命的、无名的临时变量,这临时变量是不能充当左值的。
以下程序有什么问题?
表达式的副作用
+*
( 算式B )
( 算式A )( 算式C )
(A)(C)
(B)
交换律失效
括号失效
表达式正确性的确保
表达式效率的确保
表达式练习
一、判断下列表达式是否正确,并写出变量和表达
式的值:
t8,j3,,a,b;u s g ed o g5,u;
设:int i=8,j=3,k,a,b;unsigned long w=5,u;
double x=1.42,y=5.2,t,f;
1.k=i++;
2.w+=-2;
k i+++2
3.y+=x++;
4.i/=j+12;
5.k=--i;
6.f=3/2*(t=20.2-32.1);
7.k(a2,b3,a+b);8.a2a3;
k=(a=2b=3a+b);8a=2*a=3;
9.++(i+j);10.2%-3;
11.-2%-3;12.a=2.5,b=3.5,(int)a+b/b
二、写出下列表达式的值:
设int x=3,y=1,z=32;
float f=3.1;
(x)+(x++)+(++x)+(x)
1.( x--)+(x++)+(++x)+(--x)
2.x||(x y)&&f&&!(f||x)
x||(x-y)
int a,b;b=(a=4*9,a*2),a-3;a=?b=?
int j=2,m=2;m+=(j++)+(++j)+(j++);j=?m=?
float x=2.5;(int)x,x+1
int m=17,n=5;m%=m++/--n;
17n m%=m++/n;
三、写出下列命题的表达式或语句:1.x,y都小于z。
2.x,y其中有个小于z。
2其中有一个小于
3.i是j的约数?
4.x大于y或x的绝对值大于y的绝对值。
5.n是个两位正整数?
6.n是小于正整数k的偶数。
7.某个整型数是两位奇数吗?
8.某个整型数是负的偶数吗?
9.a不属于[-20,-10]也不属于(10,20)。
10.若i=0,2,4,6….,则用i表示的奇数应表示为:
11.将一个四位整数四舍五入到百位。
将个四位整数四舍五入到百位
12.分别取一个整数的个位和百位数。
13.分别取出一个四位整数的中间两位。
14.分别取出个浮点数的整数部分和小数部分。
分别取出一个浮点数的整数部分和小数部分15.能同时被3,5,7整除的数。
16.能被3,5,7其中任意两个整除的数。
17.在100以内能被3整除,且个位是6的正整数。
18.一个变量所占内存比另一个少4。
19.先吃饭,再散步,最后理发。
先吃饭再散步最后理发
20已知x、y分别为a、b、c中的最大、最小值,求a、b、c中中间值的表达式。
21已知x、y分别为a、b、c中的最大、最小值,求a、b、c中非最大最小值的表达式。
22.用a,b,c表示的三条边能构成三角形。
用b表示的三条边能构成三角形
23.表达式(x45,x5),x25的值是:
(x=4*5,x*5),x+25
24.X是整型变量,能正确表示1<x<5的表达式是a).1<x<5b).x==2||x==4||x==3
c).1<x||x<5d).!(x<=1)&&!(x>=5)
25.下列表达式中正确的值是:
下列表达式中正确的值是
a).(a)b).a b
++(a++)a++b
c).a+++b d).a++++b
26.int x=0,y=0,z=0,w=0;
w=++x||++y&&++z;
printf(%d,%d,%d,%d,x,y,z,w);
printf(“%d%d”
27.判断一个点是否落入圆中;
10
10
-10
-10
x*x+y*y<=100
**100
28.判任意一点是否落入阴影部分(小园的半径
为1.)
2
2
-2
-2
((abs(x)-2)2+(abs(y)-2)2)<=1
((b()2)(b()2))<1。