「-->>」到底是做什么用的?

37 浏览
0 Comments

「-->>」到底是做什么用的?

这个问题已经有了答案什么是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\"运算符实际上是做什么的?

admin 更改状态以发布 2023年5月25日
0
0 Comments

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

不,"赋值运算符" 是只有一个 > 符号的 -->。它先将 x 减 1,再把结果与 0 比较。

-- >> 0 "循环运算符" 先将 x 减 1,然后右移这个结果 0 位。对于非负数的 x,右移 0 位没有影响,否则将根据实现有可能是无影响,也可能是随机的。0 右移 0 位等于 0,也就是被解释为 false,此时循环将终止。

所以,尽管这个方法 "可行",但这是表达循环的糟糕方式。

0
0 Comments

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上找到的)。

0