这是一道从《C和C++程序员面试秘笈》上摘录下来的题目
#include<iostream>
using namespace std;
int main()
{
int x=3,y=0,z=0;
x *=(y=z=4);printf("x=%d\n",x);//(1)
z=2;
x=(y=z);printf("x=%d\n",x);//(2)
x=(y==z);printf("x=%d\n",x);//(3)
x=(y&z);printf("x=%d\n",x);//(4)
x=(y&&z);printf("x=%d\n",x);//(5)
y=4;
x=(y|z);printf("x=%d\n",x);//(6)
x=(y||z);printf("x=%d\n",x);//(7)
x=(y==z)?4:5;printf("x=%d\n",x);//(8)
x=(y==z)?1:(y<z)?2:3;printf("x=%d\n",x);//(9)
return 0;
}
求程序输出结果
知识点:
(1)C++中的赋值号“=”是一个运算符,可以写成a=b=c=d,所以第一句是y和z被赋值为4;
(2)“*=”是复合赋值运算符,凡是二元运算符,都可以与赋值符一起组合成复合赋值符,如:+=,-=,*=,/=,%=,<<=,>>=,&=,|=等。功能是将赋值符左边的值(变量)对赋值符右边的整块做该复合赋值运算符中的二元运算符代表的运算,例如在(1)中,就是将x乘以右边的y(即是4),所以输出是12。
(3)赋值运算符的结合方向为“自右向左”的右结合性,所以在(1)是先将y和z赋值为4,然后再将x乘以4。
(4)“==”属于关系运算符,关系运算符包括>,<,==,>=,<=,和!=。返回bool型,false或true(0或1)。经过前面的变化,在(3)中,y=z=2,所以(y==z)结果是1(为真),再赋值给x,所以最后x为1。
(5)“&”和“|”是位运算符,位运算符包括<<(按位左移),>>(按位右移),&(按位与),|(按位或),^(按位异或),~(按位取反)。按位运算是首先把数字转化成二进制,然后两两对应,以按位与为例,只有同为1才为1,所以对(4),y=2,z=2,即有00000010&00000010=00000010,所以y&z=2;以按位或为例,只有同为0时才为0,所以对(6),y=4,z=2,即有00000100|00000010=00000110,所以y|z=6。
(6)“&&”和“||”是逻辑运算符,还包括!。就是与或非了,0为假,非0为真,所以在(5)和(7)中,x都为1。
(7)c?a:b是条件运算符,意思是若c为真则a,若c为假则b。所以在(8)中,x=5.;在(9)中,y=4,z=2首先判定y<z为假,所以有x=(y==z)?1:3,又y<z为假,所以x=3。
答案:12,2,1,2,1,6,1,5,3