在问题What is the "-->" operator in C++?中,它询问了什么 - >确实并提供了一个链接到comp.lang.c++.moderated thread. 向下滚动线程进一步发现我:
> C ++中没有这样的运算符。
>它只是两个运算符的组合:postfix decrement“ - ”和 >更大的“>”。
>这就是这个例子有效的原因。
>尝试(x - > 20),在这种情况下你将得不到输出;)
当然有。它与“运行到”运算符一起描述:
#include <stdio.h>
int main()
{
int x = 10;
while( x -->> 0 ) // x runs to 0
printf("%d ", x);
}
“跑到”操作员实际上做了什么?
答案 0 :(得分:8)
while( x -->> 0 ) // x runs to 0
不,&#34;转到运营商&#34; -->
只有>
个符号。它将x
减1,然后将结果与零进行比较。
-- >> 0
&#34;运行到运营商&#34;减少x
然后将结果向右移位零。零除零对非负x
没有任何作用,否则它的实现定义(通常什么也不做,但可能是随机的)。由零归零的零位为零,这被解释为false
,此时循环将终止。
所以&#34;工作&#34;但这是一种表达循环的可怕方式。
答案 1 :(得分:8)
while(x - &gt;&gt; 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
具有签名类型和负值,则结果值是实现定义的。
BTW / - 对于Visual Studio,根据http://msdn.microsoft.com/en-us/library/336xbhcz.aspx,实现定义的行为是“如果additive-expression为0,则不执行移位操作”。我在GCC手册中找不到任何关于此的内容(本来期望here)。
答案 2 :(得分:0)
- 递减但在递减之前返回变量的值,&gt;&gt;右操作数向右移动,即0(a.k.a。无操作),然后隐式将结果与0进行比较。