关系运算符的优先级比算术运算符低。因此,表达式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。如果这一测试失败,就没有必要继续读入下一字符。
类似地,如果在调用getchar函数之前就测试c是否为EOF,结果也是不正确的,因此, 函数的调用与赋值都必须在对c中的字符进行测试之前进行。
运算符&&的优先级比||的优先级高,但两者都比关系运算符和相等性运算符的优先级低。 因此,表达式
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的用法读起来更直观一些(“如果不 是有效的”),但对于一些更复杂的结构可能会难于理解。
自增运算符与自减运算符
c语言提供了两个用于变量递增与递减的特殊运算符。自增运算符++使其操作数递增1, 自减运算符使其操作数递减1。我们经常使用++运算符递增变量的值,如下所示:
if (c = '\n')
++nl;
++与--这两个运算符特殊的地方主要表现在:它们既可以用作前缀运算符(用在变量前 面,如++n)。也可以用作后缀运算符(用在变量后面,如n++)。在这两种情况下,其效果都 是将变量n的值加1。但是,它们之间有一点不同。表达式++n先将n的值递增1,然后再使 用变量n的值,而表达式n++则是先使用变量n的值,然后再将n的值递增1。也就是说, 对于使用变量n的值的上下文来说,++n和n++的效果是不同的。如果n的值为5,那么
x = n++;
执行后的结果是将x的值置为5,而
x = ++n;
将x的值置为6。这两条语句执行完成后,变量n的值都是6。自增与自减运算符只能作用于 变量,类似于表达式(i + j)++是非法的。
在不需要使用任何具体值且仅需要递增变量的情况下,前缀方式和后缀方式的效果相同。 例如:
if (c == '\n') nl++;
但在某些情况下需要酌情考虑。例如,考虑下面的函数squeeze(s, c),它删除字符串s 中出现的所有字符c
/* squeeze: delete all c from s */ void squeeze(char s[], int c)
{int i, j;
for (i = j = 0; s[i] != '\〇';i++) if (s[i] != c)
s[j++] = s [i]; s[j] = '\0';}
每当出现一个不是c的字符时,该函数把它拷贝到数组中下标为j的位置,随后才将j的值 增加1,以准备处理下一个字符。其中的if语句完全等价于下列语句: 计算机游戏两个火柴堆的程序设计(5):http://www.youerw.com/jisuanji/lunwen_6693.html