&&(与运算符)表示并且的意思。||(或运算符)表示或者的意思。
与运算符和或运算符都是双目操作符(因为两者都有左右两个表达式)。
在条件判断语句中:
当使用&&(与运算符)时,只有左右两边表达式都成立时,才能满足条件,执行条件判断语句中的代码。
if ( num >= 5 && num <= 9)
上述代码中,只有&&(与运算符)的左侧表达式为真,即当num的值大于等于5的时候,才会执行右侧的表达式,当右侧的表达式也为真时,才能执行if语句中的代码。
如果&&(与运算符)的左侧表达式不成立的话,那么右边的表达式将不再执行。
当使用||(或运算符)时,只要左右两边表达式中有一个成立时,就能满足条件,执行条件判断语句中的代码。
if ( num == 1 || num == 2 || num ==3 )
上述代码中,如果num的值为1,则只用执行最左侧的表达式即可,如果num的值位2,则需要依次执行最左侧的表达式和中间的表达式,如果num的值为3,则需要依次执行最左侧的表达式、中间的表达式、最右侧的表达式。只要num符合上述三个表达式中的一个,就可以执行if语句中的代码。
自增符:
a++表示先使用a,在让a自加1。
++a表示想让a自加1,在使用a。
#include <stdio.h> int main() { int a = 6; int b = a++; int c = ++a; printf("a=%d b=%d c=%d", a, b, c); return 0; }
运行结果:
a=8 b=6 c=8
分析步骤:
①a的初始值为6
②在 int b = a++;中,先将a的值赋值给b,然后a自加1变为7
③在 int c = ++a;中,a先自加1变为8,然后将值赋值给c
故可得上述运行的结果。
自减符:
a--表示先使用a,在让a自减1。
--a表示想让a自减1,在使用a。
#include <stdio.h> int main() { int a = 6; int b = a--; int c = --a; printf("a=%d b=%d c=%d", a, b, c); return 0; }
运行结果:
a=4 b=6 c=4
分析:
①a的初始值为6
②在 int b = a--;中,先将a的值赋值给b,然后a自减1变为5
③在 int c = ++a;中,a先自减1变为4,然后将值赋值给c
故可得上述运行的结果。
c语言逻辑运算符的特点:先对左侧的表达式求值,在对右侧的表达式求值。当左边的表达式满足逻辑运算符的条件时,不在对右边的表达式求值,这种情况被称为短路。
c语言中,若表达式为假,则为0,为真,则为1,非零均表示真
#include <stdio.h> int main() { int i = 0, a = 5, b = 6, c = 7; i = a++ && ++b && c++; printf("i=%d a=%d b=%d c=%d", i, a, b, c); return 0; }
运行结果:
i=1 a=6 b=7 c=8
重要步骤分析:(先分析最左侧与运算符的两个表达式)
在表达式 i = a++ && ++b && c++;中,先执行左侧的表达式a++,因a为5,故表示真,执行之后a自加1变为6,然后执行表达式++b(b先自加1变为7, 表示真)。此时,可以将前两个表达式看为与运算符的左边的表达式,易知,此时左边的表达式为真。最后执行右边的表达式c++,因c为7,故表示真,执行之后c自加1变为8,故最终可知这三个表达式都表示为真,故i的值为1(c语言中,若表达式为假,则为0,为真,则为1,非零均表示真)
在其他条件不变的情况下,上述整型变量a的值为0,则运行结果为:
i=0 a=1 b=6 c=7
原因:在表达式 i = a++ && ++b && c++;中 逻辑操作符均为&&(与操作符),故表达式都为真是,i的值才为1。
在表达式 i = a++ && ++b && c++;中,先执行左侧的表达式a++,因a为0,故表示假,执行之后a自加1变为1,又逻辑操作符都是&&(与操作符)故将表达式执行完后,其结果一定为假,因此,也没必要执行后面的表达式。(在执行程序时,后面两个表达式是不会执行的,这种情况称为短路)
#include <stdio.h> int main() { int i = 0, a = 5, b = 6, c = 7; i = a++ || ++b || c++; printf("i=%d a=%d b=%d c=%d", i, a, b, c); return 0; }
运行结果:
i=1 a=6 b=6 c=7
分析:
在表达式 i = a++ || ++b || c++;中,先执行左侧的表达式a++,因a为5,故表示真,执行之后a自加1变为6。因为逻辑操作符均为或||(操作符)故只要一个表达式为真即可,故i的值为1。
因为第一个表达式已经符合条件(即为真),故不会执行后面的表达式。
#include <stdio.h> int main() { int i = 0, a = 0, b = 6, c = 7; i = a++ || ++b && c++; printf("i=%d a=%d b=%d c=%d", i, a, b, c); return 0; }
运行结果:
i=1 a=1 b=7 c=8
分析:
在表达式 i = a++ || ++b && c++;中,先执行左侧的表达式a++,因a为0,故表示假,执行之后a自加1变为1,然后执行表达式 ++b(b先自加1变为7,表示真),故||(或操作符)的结果为真,最后执行表达式c++,因c为7,故表示真,执行之后c自加1变为8
由&&(与运算符)知,最终结果为真,故i的值为1。