关于C++:–>>实际上是什么?


What does -->> actually do?

本问题已经有最佳答案,请猛点这里访问。

问题是C++中的"->"运算符是什么?它询问-->做什么,并提供指向comp.lang.c++中继线程的链接。向下滚动一点,我发现:

> There is no such operator in C++.

> It's just a combination of two operators: postfix decrement"--" and
> greater">".

> That's why this example works.

> Try ( x --> 20 ) and you'll get no output in this case;)

Of course there is. It is described together with"runs to" operator:

1
2
3
4
5
6
7
#include <stdio.h>
int main()
{
   int x = 10;
   while( x -->> 0 ) // x runs to 0
     printf("%d", x);
}

"跑向"操作员实际上做什么?


while( x -->> 0 ) // x runs to 0

这实际上是-->>运算符的混合体,格式更好地如下:

1
while (x-- >> 0)

对于这个特定的用法,在右手边为0的情况下,由于后缀--,每个循环迭代都会减少x,并且之前(预减量)的值会被>> 0右移0位,当x为非负时,它完全不起作用。

x为1时,后减量将其减为0,移位的结果值为0,这将导致循环终止。

更一般地说,如果您试图对负值(例如,x从0开始或负值大于INT_MIN,因此x--产生负值)使用>>,则结果是定义的实现,这意味着您必须查阅编译器文档。您可以使用编译器文档来解释它在循环中的行为。

本标准相关部分:5.8/3:

The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2^E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.

btw/-对于Visual Studio,根据http://msdn.microsoft.com/en-us/library/336xbcz.aspx,实现定义的行为为"如果加法表达式为0,则不执行移位操作"。我在GCC手册中找不到任何关于这个的信息(应该在这里找到)。


1
while( x -->> 0 ) // x runs to 0

不,"转到操作员"是-->,只有一个>符号。它将x减少1,然后将结果与零进行比较。

-- >> 0的"运行到运算符"使x减小,然后将结果右移零。零位移位对非负x没有任何作用,否则它是定义的实现(通常不做任何事情,但可以是随机的)。被零移位的零位为零,被解释为false,此时循环将终止。

所以它"起作用",但它是表达循环的一种糟糕的方式。


--减量,但返回减量前变量的值,>>按右操作数右移,即0(a.k.a.no op),然后将结果隐式与0进行比较。