1.1 C语言的逻辑值
关系表达式和逻辑表的是的运算结果都会得到一个逻辑值。逻辑值只有两个,分别用“真”和“假”来表示。在C语言中,无专门的“逻辑值”,而是用非0表示“真”,用0表示“假”。
1.2 关系运算符和关系表达式
关系运算是逻辑运算中比较简单的一种,是进行两个数的比较,判断比较的结果是否符合指定的条件。C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称为“关系运算符”(relational operator)
1.2.1 C语言的关系运算符
关系运算符主要有下⾯6个。
(1) > ⼤于运算符 (2)< ⼩于运算符 (3)>= ⼤于等于运算符
(4) <= ⼩于等于运算符 (5) == 相等运算符 (6)!= 不相等运算符
注意:1.有两个字符组成的运算符之间不允许有空格,如:<=不能写成< =。
2.关系运算符是双目运算符,具有自左至右的结合性。
3.在以上运算符中,前4种关系运算符优先级别相同,后两种相同,并且前四种的优先级高于后两种。
1.2.2 C语言的关系表达式
有关系运算符构成的表达式,称为关系表达式。关系表达式通常返回 0 或 1 ,表示真假。
例如:当a=3,b=2,c=1时
a>b为“真”,表达式的值为1
(a>b)==c的值为“真”,表达式的值为1
b+c>a的值为“假”,表达式的值为0
注意:当关系运算符构成的表达式,例如一边是整型,另一边是浮点型,则系统自动把整型转换为浮点型,然后进行比较。若x,y都是浮点数,应当避免使用x==y这样的关系表达式,因为通常存放在内存中的浮点数都是有误差的,不可能精确相等,这将导致关系表达式x==y的值总是为0。
1.3 逻辑运算符与逻辑表达式
1.3.1逻辑运算符
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。在C语⾔中,⾮0表示真,0表示假。
! (逻辑非):逻辑取反运算符(改变单个表达式的真假)。
&& (逻辑“与”):,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| (“逻辑”或“):或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
注意:&&运算符和||运算符为双目运算符,!运算符为单目运算符,出现在运算对象的左边。逻辑运算符具有自左向右的结合性。
1.3.2逻辑表达式
由逻辑运算符和运算对象组成的表达式成为逻辑表达式。逻辑表达式的运算结果为1(”真“)或者为0(”假“)。
a | b | !a | !b | a&&b | a||b |
---|---|---|---|---|---|
非0 | 非0 | 0 | 0 | 1 | 1 |
非0 | 0 | 0 | 1 | 0 | 1 |
0 | 非0 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 0 | 0 |
补充:短路和运算符优先次序
短路 C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。 如前⾯的代码:
if(month >= 3 && month <= 5)
表达式中&& 的左操作数是 month >= 3 ,,右操作数是 month <=5,当左操作数 month >= 3的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。 所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
对于 || 操作符是怎么样呢?我们结合前⾯的代码:
if(month == 12 || month==1 || month == 2)
如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。 所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。 像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。
运算符优先次序
同一优先级的运算符,运算次序由结合方向所决定。
! > 算术运算符 > 关系运算符 > && > || > 赋值运算符