什么 - >>实际上呢?

时间:2014-05-26 01:37:58

标签: c++

在问题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);
}

“跑到”操作员实际上做了什么?

3 个答案:

答案 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进行比较。