逻辑运算符的优先级比关系运算符优先级低,所以不必在子表达式两侧加圆括号。
iso646.h头文件
因此,C99标准新增了可代替逻辑运算符的拼写,它们被定义在iso646.h头文件中。
如果在程序中包含该头文件,便可用and代替&&、or代替||、not代替!。
例如,可以把下面的代码:
if ( ch != '"' && ch != '\'')
charcount++;
改写为:
if ( ch != '"' and ch != '\'')
charcount++;
读者也许很好奇,为何C不直接使用and、or和not? 因为C一直坚持尽量保持较少的关键字。
7.3.2 优先级
!运算符优先级很高,比乘法运算符还高,与递增运算符优先级相同,之比
圆括号的优先级低。&&运算符优先级比||运算符高,但是两者的优先级都比关系
运算符低,比赋值运算符高。因此,
表达式a > b && b > c || b > d 相当于 ((a > b) && (b > c)) || (b>d)
求值顺序:
逻辑表达式的求值顺序是从左往右。一旦发现有使整个表达式为假的因素,立即停止求值。
7.3.3 求值顺序
C保证逻辑表达式的求值顺序是从左往右。&&和||运算符都是序列点。所以程序在从一个运算对象执行到下一个运算对象之前,所有的副作用都会生效。
C保证一旦发现某个元素让整个表达式无效,便立即停止求值。正是由于有这些规定,才能写出这样结构的代码:
while ((c = getchar()) != ' ' && c != '\n')
如上代码所示,读取字符直至遇到第一个空格或换行符。第1个子表达式把读取的
值给c,后面的子表达式会用到c的值。如果没有求值顺序的保证,编译器可能在给c赋值之前先对后面的表达式求值。
这里还有一个例子:
if (number != 0 && 12/number == 2)
printf("The number is 5 or 6.\n");
如果number的值是0,那么第1个子表达式为假,且不再对关系表达式求值。这样
避免了把0作为除数。许多语言都又没这种特性,知道number为0后,仍继续检查后面的条件。
最后,考虑这个例子:
while ( x++ < 10 && x + y < 20)
实际上,&&是一个序列点,这保证了在对&&右侧的表达式求值之前,已经递增 了x。
求值顺序:
逻辑表达式的求值顺序是从左往右。一旦发现有使整个表达式为假的因素,立即停止求值。
无论使用哪种特定的字符编码,islower()函数都能正常运行(不过,一些早期的 编译器没有ctype.h系列)。