「-->>」到底是做什么用的?
「-->>」到底是做什么用的?
这个问题已经有了答案:什么是C++中的\"-->\"运算符?
在问题什么是C++中的\"-->\"运算符?中,它询问-->的含义,并给出了comp.lang.c++.moderated线程的链接。在线程向下滚动一段时间后,我发现了这个:
> C++中没有这样的运算符。
> 这只是两个运算符的组合:后缀递减\"--\"和\"大于\">\"。
> 这就是为什么这个例子能够工作。
> 尝试( x --> 20 ),这种情况下你将得不到任何输出;)
当然有这个运算符。它与\"runs to\"运算符一起描述:
#include int main() { int x = 10; while( x -->> 0 ) // x runs to 0 printf("%d ", x); }
\"runs to\"运算符实际上是做什么的?
while (x -->> 0) // x运行到0
实际上,这是--
(后缀递减)和>>
(位右移)运算符的混合形式,更好的格式为:
while (x-- >> 0) ...
对于这个特定的用法,在右侧为0的情况下,由于后缀--
,x
在每个循环迭代中递减,而前一个(前缀递减)值通过>> 0
向右移动0位,当x
为非负值时根本不起作用,因此该语句可以简化为:
while (x--) ...
当x
为1非零时,为true
,用于while
测试,然后后缀递减将其减少为0,循环最后一次执行(在该迭代期间x
为0);下次使用while(x--)
,x
已经为0,循环终止,x
在无符号类型中的最高可表示值上保持不变。
更一般地,如果尝试在负值上使用>>
(例如,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,如果加性表达式为0,则不执行移位操作的实现定义行为。我在GCC手册中找不到任何相关内容(本来期望应该在https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Integers-implementation.html#Integers-implementation上找到的)。