逻辑运算:
对于逻辑运算来说,结果和操作数(运算符的作用对象)都只有两个状态,即真(1)和假(0)。
对于操作数来说,非0即为1(只要操作数不为0,就视为1)。
逻辑运算符:
1. &&(逻辑与):当逻辑与两边操作数都为真(1)时结果为真(1)。
可视为乘法运算(只有1×1时为1,0×1以及1×0都为0),因此操作数都为真时才为真
2. ||(逻辑或):当逻辑或两边的操作数都为假(0)时结果为假(0)。
可视为加法运算(只有0+0时为0,1+1,0+1,1+0都为1),因此操作数都为假时才为假
3. !(逻辑非):逆转操作数状态,真变假,假变真。
结合性(即运算顺序):
&&(从左到右),||(从左到右),!(从右到左)
C语言中,除了赋值运算符,条件运算符,单目运算符是右结合性(即从右到左),其余均为左结合性(从左到右,)当多种运算符同时参与运算时,先考虑运算符的优先级,优先级相同时根据结合性来确定运算顺序(如-i++中-和++优先级相同,-与++都是右结合性,所以-i++等同于-(i++))。
优先级:
单目右左,算术关系,逻辑单双三,赋值逗号(目即操作数,单目为一个操作数,双目为两个操作数,以此类推)。
单目右(左)运算符:操作数在左(右),符号在右(左)的运算符:++(单目右运算符i++),++(单目左运算符++i)。
当单目左++(--)或单目右++(--)出现在逻辑运算符两侧时。i++是先将i的值代入表达式进行运算,在语句结束后i的值才加1,而++i是先将i+1,将(i+1)的值代入表达式进行运算。如左图所示,将i=0代入表达式,得出表达式为假(0),该语句结束后i的值加1,所以i为1,。如右图所示,将(i=i+1)的值即1代入进行运算,得出表达式为真,i也为1
算术关系(算术运算符,关系运算符)
逻辑单双三(逻辑单目运算符,逻辑双目运算符,逻辑三目运算符)
赋值逗号(赋值运算符,逗号)
注:详细的运算符优先级可查阅以下几个网站,多写多练才能更加熟悉。
C语言重要知识点总结【5】:C语言34种运算符优先级及结合性_运算符丰富_星空之路Star的博客-CSDN博客
短路法则:
对于逻辑与运算符 &&,如果左侧的操作数为假(即结果为0),则右侧的操作数将不会被求值。因为无论右侧的操作数是什么,整个逻辑表达式的结果都将是假。
由图可知当&&左侧为假时,++j没有被执行,所以j的值为0,当&&左侧为真时,++j被执行,所以j的值为1。
对于逻辑或运算符 ||,如果左侧的操作数为真(即结果为非零),则右侧的操作数将不会被求值。因为无论右侧的操作数是什么,整个逻辑表达式的结果都将是真。
由图可知当||左侧为真时,++j没有被执行,所以j的值为0,当||左侧为假时,++j被执行,所以j的值为1。
如果你掌握了上述内容,请试着求
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
i++ && ++j || ++k;
printf("i = %d\n", i);
printf("j = %d\n", j);
printf("k = %d\n", k);
return 0;
}
你可以试着改变&&与||的顺序,++的顺序(++i,i++,++j,j++,++k,k++)