3.10.2 认识逻辑或运算符
原则上,函数cusum的参数值应该大于0,毕竟是从1开始相加嘛。但如果调用者传递的参数值为0,那也不会出什么乱子,因为函数cusum恰好能够在参数r的值为0时返回0。你可以试着阅读前面的代码,或者动手在调试器里观察一下。
当然,如果不怕麻烦,你也可以将变量r的值是否为0作为判断条件之一。如以下新版的cusum函数所示,我们在if语句里加入了两个判断条件。
unsigned long long int cusum(unsigned long long int r) { unsigned long long int sum = 0; if(r == 0 || r > 1000000000) return 0; else while(r)sum += r --; return sum; }
非常明显地,if语句的控制表达式里出现了一个新的运算符“||”,称为逻辑或运算符。注意,这两个竖线必须挨在一起写。逻辑或运算符是二元运算符,有一左一右两个操作数,例如5 || 6,这样的表达式称为逻辑或表达式。
逻辑或运算符的功能是对两个操作数的值进行逻辑上的相加操作,也就是生活中的“或者”,两者居其一的意思。因此,它的结果是这样决定的:如果左操作数和右操作数的值都是0,则逻辑或运算符的结果(或者说逻辑或表达式的值)也是0;否则,如果左操作数和右操作数的值全都不为0,或者至少有一个不为0,则逻辑或运算符的结果(或者说逻辑或表达式的值)是1。举例来说,表达式0 || 0的值是0;表达式0 || 1的值是1;表达式1 || 0的值是1;表达式0 || 9的值是1;表达式5 || 6的值也是1。
逻辑或运算符||的优先级低于==和>。因此,在上述代码中,运算符||的操作数分别是r>1000000000(的值)和r == 0(的值),即,表达式r == 0 || r>1000000000等价于(r == 0)||(r>1000000000)。
表达式r == 0 || r>1000000000的意思很清楚:变量r的值要么为0,要么大于1000000000,两者可能都不成立,也可能有一个是成立的。如果都不成立,则该表达式等效于0 || 0;如果前者成立而后者不成立,则该表达式等效于1 || 0;如果前者不成立而后者成立,则该表达式等效于0 || 1。在后两种情况下,整个逻辑或表达式的值为1,将执行if语句的第一个子句:
return 0;
否则,在第一种情况下,也就是该表达式等效于0 || 0的情况下,意味着变量r的值既不为0,也不大于1000000000,整个逻辑或表达式的值为0,执行else子句:
while(r)sum += r --;