2.6 关系运算符与逻辑运算符
关系运算符包括下列几个运算符:>
、>=
、<
、<=
,它们具有相同的优先级
优先级仅次于它们的是相等性运算符:==
、!=
关系运算符的优先级比算术运算符低,因此,表达式 i < lim - 1
等价于 i < (lim - 1)
逻辑运算符 &&
与 ||
有一些较为特殊的属性
由 &&
与 ||
连接的表达式按从左到右的顺序进行求值,并且,在知道结果值为真或假后立即停止计算
绝大多数 C 语言程序运用了这些属性
下边的例子在功能上与第 1 章的输入函数 getline
中的循环语句等价:
for (i = 0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
在读入一个新字符之前必须先检查数组 s
中是否还有空间存放这个字符,因此首先测试条件 i < lim-1
如果这一测试失败,就没有必要继续读入下一字符了
运算符 &&
的优先级比 ||
的优先级高,但两者都比关系运算符和相等性运算符的优先级低
因此,表达式:
i < lim - 1 && (c = getchar()) != '\n' && c != EOF
不需要另外加圆括号
但是,由于运算符 !=
的优先级高于赋值运算符的优先级,因此,在表达式:
(c = getchar()) != '\n'
中需要使用圆括号,这样才能达到预期的目的:先把函数返回值赋值给 c
,然后再将 c
与 '\n'
进行比较
根据定义,在关系表达式或逻辑表达式中,如果关系为真,则表达式的结果值为数值 1
,如果为假,则结果值为数值 0
逻辑非运算符 !
的作用是将非 0
操作数转换为 0
,将操作数 0
转换为 1
该运算符通常用于类似 if (!valid)
的结构中
一般不采用 if (valid == 0)
的形式
当然,很难评判上述两种形式哪种更好
类似于 !valid
的用法读起来更直观一些(“ 如果不是有效的 ”)
但对于一些更复杂的结构可能会难于理解