>>其实呢?
这个问题在这里已经有了答案:
while(x - >> 0)// x运行到0
这实际上是--
(后递减)和>>
(右移位)运算符的混合体,格式更好:
while (x-- >> 0)
对于这个特定的用法,在右边为0时,由于后缀--
,每次循环迭代x
递减,并且先前(递减前)值被>> 0
右移0位,其根本不执行任何操作当x
不是负数时。
当x
是1时,后减量将其减小到0,并且移位的结果值为0,这将导致循环终止。
更一般地说,如果您尝试使用>>
作为负值(例如x
从0开始或负值大于INT_MIN
,因此x--
产生负值),结果是实现定义的 ,这意味着您必须咨询您的编译器文档。 你可以使用你的编译器文档来推断它在循环中的表现。
标准的相关部分:5.8 / 3:
E1 >> E2
的值是E1
右移E2
位的位置。 如果E1
具有无符号类型或者E1
具有带符号类型和非负值,则结果的值是E1/2^E2
的商的整数部分。 如果E1
有签名类型和负值,则结果值是实现定义的。
顺便说一句 - 对于Visual Studio,根据http://msdn.microsoft.com/en-us/library/336xbhcz.aspx,实现定义的行为是“如果additive-expression为0,则不执行移位操作”。 我在GCC手册中找不到任何关于此的内容(这里预计会发生这种情况)。
while( x -->> 0 ) // x runs to 0
不,“去操作员”是-->
只有一个>
符号。 它将x
减1,然后将结果与零比较。
-- >> 0
“运行到运算符”减小x
,然后将结果右移0。 由零移位对于非负x
不做任何事情,否则它是实现定义的(通常什么都不做,但可能是随机的)。 被零移位的零为零,将其解释为false
,此时该循环将终止。
所以它“起作用”,但它是表达循环的可怕方式。
- 递减,但在递减之前返回变量的值,>>右移右边的操作数,即0(也称为非操作数),然后隐式地将结果与0进行比较。
链接地址: http://www.djcxy.com/p/1973.html上一篇: >> actually do?
下一篇: > means in Java?