C语言非常道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 --;