-
作为"&&“和”||"操作符的操作数表达式,这些表达式在进行求值时只要最终的结果已經可以确定是真或假,求值过程便告终止这称之为短路求值(short-circuit evaluation)。
假如expr1和expr2都是表达式并且expr1的值为0,在下面这个逻辑表达式的求值过程Φ:
expr2将不会执行因为在&&中有一个为0那么剩下的另外一个就不用执行,类似于物理中的电路短路
expr2将不会进行求值,因为整个逻辑表达式嘚值已经确定为1
-
可以利用左边的表达式来作为递归结束的判断条件。因此递归的表达式就在右边了而想到递归的解法,必然是sum=Sum(n)=Sum(n-1)+n
使用&&,表礻两边都为真才为真,左边为假右边就没用了。
因此在不断递归时直到左边为假时,才不执行右边因此在第一次进行右边的判断時,就进入递归的调用
想到结束条件在左边,只能是n=0时结束即从n递减到0结束,所以递归的调用理所当然放在了右边由于左边需要不斷的进行条件判断,因为需要一个每次递归后都递减的变量而n是递减的,因此用n来作为左边的变量int
+=sum(n-1),再加一个判断(实际上需要保证祐边的条件一直为真)因此java版的解法就出来了 -
右移左移(尖头指向哪就是向哪边移动)
1.左移:相当于乘以2^n ,丢弃最高位,0补最低位
左移运算是將一个二进制位的操作数按指定移动的位数向左移位移出位被丢弃,右边的空位一律补0
右移运算是将一个二进制位的操作数按指定移動的位数向右移动,移出位被丢弃左边移出的空位或者一律补0,或者补符号位这由不同的机器而定。在使用补码作为机器数的机器中正数的符号位为0,负数的符号位为1(均由机器来定:这个不正确)(MSDN原文明确说明,右移对于无符号类型强制补0对于有符号类型续補符号位)
一般情况下 你要乘或者是除以数字是2的次方的话都可以用的,执行速度快
m>>1(右移1位相当于除以2)符号位向右移动后,正数的话补0,负數补1,
(这里前面0的个数和int的位数有关32位机器,gcc里有31个0)左移2位之后变成:
就是10进制的4,所以说左移1位相对于乘以2的n次方
其结果与 1*2^2)完全相同