我们常用逻辑与(&&)和逻辑非(||)进行分支结构中的逻辑判断。那么多个逻辑判断符的运算方式如何运行的呢?
如下
int a = 0;
int b = 2;
int c = 3;
int d = 4;
int i = a++ && b++ && c++ &&d++;
printf("a=%d b=%d c=%d d=%d",a, b, c, d);
根据自加的运算方式,我们可以得到结果a=1;b=3;c=4;d=5.
那么结果真的是这样吗?
我们发现,只有a自加了,这是由于计算机为了简化计算做的设定,在逻辑与(&&)运算中,若首操作数出现一个0之后便会停止后续的计算,所以在上式中a++先作为0加入计算后自加。而第一个逻辑与一旦发现了0就停止运算,运算结果为0,b++没有被运算。接着运算下一个逻辑与表达式0&&c++同理可知该逻辑与运算第一个操作数为0.不进行后续运算,同理还有下一个逻辑与0&&d++,所以只有a自加了.
逻辑或也能同理,首操作数数不为0便停止后续运算。
如
int a = 0;
int b = 2;
int c = 3;
int d = 4;
int i = a++ || b++ ||c++ ||d++;
printf("a=%d b=%d c=%d d=%d",a, b, c, d);
逻辑或(||)运算首操作数为0,进行下一个操作数的计算。此时a++,b++。而a++||b++的结果为1.所以在下一个逻辑或(1||c++)中不进行后续运算,直接输出1。同理可得,我们也能知道d++不会被运行。
所以只有a,b自加了1.打印结果为a=1,b=3,c=3,d=4
既然知道了逻辑与(&&)和逻辑或(||)的运算规律了,我们来了解一下逻辑与和逻辑或的混合运算形式。
如下
int a = 0;
int b = 2;
int c = 3;
int d = 4;
int i = a++ && b++ || c++ || d++;
printf("a=%d b=%d c=%d d=%d",a, b, c, d);
我们可将该逻辑运算分为三步
第一步是先运算a++&&b++,逻辑与的第一个数为0,停止运算,运算结果为0.所以此时a自加1,b没有自加。
第二步是将a++&&b++的结果视为0,将式子变成0||c++,由逻辑与的计算方式可知,第一个操作数为0,继续往后运算,此时c++,运算结果为1.
第三步同理,将式子化为1||d++。由于第一个操作数的结果为1,停止运算下一个操作数,逻辑或运算中有一个数非0,运算结果为1.
综上,我们可得到该过程自加的操作数有a,c。所以输出结果为a=1,b=2 c=4 d=4