本帖最后由 09927306 于 2011-1-8 19:03 编辑
【例3-9】 关系表达式的计算。
- 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--);
- }
复制代码
程序执行赋值语句y=z=x++后,得到z=8,y=8,x=9。第一个printf()输出的是关系表达式(x>y)==(z=x–1)的值。该表达式中x>y的计算结果是1,z=x–1的计算结果8(注意z=x–1是赋值表达式),经过1==8的比较后可知该关系表达式的值是0。执行赋值语句x=y==z时,由于“==”的优先级高于“=”,故先进行y==z比较,然后将比较的结果赋给变量x。由于y和z的值均为8,故y==z的值为1,从而得到x=1。第三个printf()中的输出项是关系表达式x++>++y–z– –,即比较1>=9–8,得到结果为1。程序运行后输出为:0
1
1 【例3-10】 逻辑表达式的计算。
- #define EOF 1
- main()
- { int a=3,b=4,c=5;
- printf("%d\n",3*(a+b)>c&&a++||c!=0&&!EOF);
- }
复制代码
该逻辑表达式包含多种运算符,其计算过程如图3-2所示。图3-2中方框内的数字是各步计算的结果,圆圈内的数字是计算的顺序编号。程序运行结果为:1。 【例3-11】
- main()
- { int a=1,b=2,c=3,d=4,m=2,n=2;
- (m=a>b)&&(n=c>d);
- printf("%d %d\n",m,n);
- }
复制代码
程序将逻辑表达式(m=a>b)&&(n=c>d)作为一条语句。在执行该语句时,先计算m=a>b,由于“>”的优先级高于“=”,这是一个赋值表达式,计算结果为m=0。对于逻辑与来说,只要有一个运算量为0,整个逻辑表达式的值即为0,因此表达式n=c>d将不被计算。这样,变量n并未被赋值,其值仍为2,而不是0。程序输出的结果为: 0
2 【例3-12】 设x为int型变量,请写出与关系表达式x==0等价的最简单的逻辑表达式及能表示x为正奇数的逻辑表达式。 关系表达式x==0表示的含义是:当x=0时,取逻辑真;否则,取逻辑假。与之等价的逻辑表达式是!x。因为对!x而言,若x=0,则!x为非0,即逻辑真;若x≠0,则!x为0,即逻辑假。不难看出,与x==0等价的逻辑表达式是!x。 为了判断x是不是奇数,相当于判断x能否被2整除,可以用x%2!=0或x%2==1来判断。因此,表示正奇数的逻辑表达式是x>0&&x%2!=0,也可以写成x>0&&x % 2、!(x<=0)&&!(x%2==0)等多种形式。 【例3-13】 用sizeof测试Turbo C中各种数据类型的长度。
- main()
- { char ch;
- float a=1.28,b=3000.0;
- printf("char:%d\n",sizeof(char));
- printf("short int:%d int:%d long int:%d\n",
- sizeof(short int),sizeof(int),sizeof(long int));
- printf("float:%d\n",sizeof(a));
- printf("double:%d long double:%d\n",
- sizeof(double),sizeof(long double));
- printf("float express:%d\n",sizeof(a+b));
- printf("character express:%d\n",sizeof('a'-'0'));
- }
复制代码
程序运行结果如下:
char:1
short int:2
int:2
long int:4
float:4
double:8
long double:10
float express:8
character express:2
【例3-14】 位操作及由位操作运算符组成的复合赋值运算符。
- main()
- { int a=10,b=11,c1,c2,n=1;
- c1=a,c2=b;
- a&=b;
- b|=a;
- printf("a=%d&%d=%d,b=%d|%d=%d\n",c1,c2,a,c2,c1,b);
- a=c1,b=c2;
- a>>=n+1;
- b<<=n+1;
- printf("a=%d>>%d=%d,b=%d<<%d=%d\n",c1,n+1,a,c2,n+1,b);
- a=c1,b=c2;
- a=~a;
- b^=a;
- printf("a=~%d=%d,b=%d^%d=%d",c1,a,c2,c1,b);
- }
复制代码
复合赋值运算符的概念已在3.2节介绍过了,不再赘述。本程序的运行结果为:
a=10&11=10,
b=11|10=11
a=10>>2=2,
b=11<<2=44
a=~10=-11,
b=11^10=-2
【例3-15】 将任意整数x的后6位全部置0,其余各位不变。例如,当x=95时,其二进制表示为0000000001011111,要使它的后6位全部置0,而其余各位保持不变,应该得到的二进制数是0000000001000000,即整数64(八进制100)。 要将x的后6位置0,只要找到一个数y,它的后6位全为0而其他各位全为1。再将x和y进行按位与(&)运算就可得到所需结果。只要对八进制整数077按位取反,就得到符合要求的y,即y=~077,这样,对任何整数x,x=x&y都能使x的后6位置0而其余位保持不变。程序如下:
- main()
- { int x;
- scanf("%d",&x);
- x&=~077;
- printf("x=%o\n",x);
- }
复制代码
程序运行时,若从键盘输入95,则输出为100(八进制表示)。
三楼继续 |