关系运算和逻辑运算

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时,就⽆需执⾏右操作数。 像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值

运算符优先次序

同一优先级的运算符,运算次序由结合方向所决定。

! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

你可能感兴趣的:(c语言)