C++中的”–>”运算符是什么?

What is the “-->” operator in C++?

在阅读了Edcx1(0)中C++/STL的隐藏特性和暗角之后,我完全惊讶于在Visual Studio 2008和G++ 4.4中编译和工作了下面的片段。

代码如下:

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

我假设这是C,因为它也适用于GCC。这在标准中是在哪里定义的,它是从哪里来的?


-->不是一个运算符。它实际上是两个独立的操作符,-->

条件的代码在返回x的原始(未递减)值的同时递减x,然后使用>运算符将原始值与0进行比较。

为了更好地理解,该声明可以写如下:

1
while( (x--) > 0 )


或者完全不同的东西…X幻灯片到0

1
2
3
4
5
6
while (x --\\
            \\
             \\
              \\
               > 0)
     printf("%d", x);

不是很数学,但是…每一幅画都画上千言万语…


这是一个非常复杂的操作符,所以即使ISO/IEC JTC1(联合技术委员会1)将其描述放在C++标准的两个不同部分。

除此之外,它们是两种不同的算子:EDOCX1×1和EDOCX1,2分别描述在++2.6/2和5.9的C++03标准中。


相当于

1
while (x-- > 0)

x--(后减量)相当于x = x-1,因此,代码转换为:

1
2
3
4
while(x > 0) {
    x = x-1;
    // logic
}


x在相反的方向上可以更快地归零:

1
2
3
4
5
6
int x = 10;

while( 0 <---- x )
{
   printf("%d", x);
}

8 6 4 2

你可以用箭头控制速度!

1
2
3
4
5
6
int x = 100;

while( 0 <-------------------- x )
{
   printf("%d", x);
}

90 80 70 60 50 40 30 20 10

;)


它是

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d", x);
     }

     return 0;
}

只是空间让事情看起来很有趣,--减量和>比较。


-->的使用具有历史意义。递减过去(在某些情况下仍然如此),比x86体系结构上的递增快。使用-->表明x将指向0,并吸引具有数学背景的人。


1
while( x-- > 0 )

就是这样分析的。


真是极客,但我会用这个:

1
2
3
4
5
6
7
8
9
#define as ;while

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    do printf("n is %d\
"
, n) as ( n --> 0);
    return 0;
}


我读过的一本书(我记不清是哪本书)说:编译器试图使用左-右规则将表达式解析为最大的标记。

在这种情况下,表达式:

1
x-->0

解析为最大的标记:

1
2
3
4
5
token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0

同样的规则也适用于此表达式:

1
a-----b

解析后:

1
2
3
4
5
6
token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b

我希望这有助于理解复杂的表达^^


这和

1
2
3
4
while (x--)
{
   printf("%d", x);
}

非负数


不管怎样,我们现在有一个"去"的接线员。"-->"很容易被记忆为一个方向,"当x归零时"是直接的意思。

此外,在某些平台上,它比"for (x = 10; x > 0; x --)"稍微高效一点。


此代码首先比较x和0,然后比较x。(在第一个回答中也说过:您是后减x,然后将x和0与>运算符进行比较。)请参见此代码的输出:

1
9 8 7 6 5 4 3 2 1 0

现在,我们首先比较,然后通过在输出中看到0进行递减。

如果要先递减然后比较,请使用以下代码:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void)
{
    int x = 10;

    while( --x> 0 ) // x goes to 0
    {
        printf("%d", x);
    }
    return 0;
}

输出是:

1
9 8 7 6 5 4 3 2 1

运行此代码时,编译器将打印出9876543210。

1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main()
{
    int x = 10;

    while( x --> 0 ) // x goes to 0
    {
        std::cout << x;
    }
}

果不其然。while( x-- > 0 )实际上是指while( x > 0)x--后减额x

1
2
3
4
5
while( x > 0 )
{
    x--;
    std::cout << x;
}

是一种不同的写作方式。

不过,很高兴原版看起来像"X变为0"。


-->之间缺少一个空格。x是后减量,即检查x>0 ?条件后减量。


--是减量运算符,>是大于运算符。

这两个运算符作为单个运算符应用,如-->


它是两个运算符的组合。第一个--用于减小值,而>用于检查值是否大于右操作数。

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>

int main()
{
    int x = 10;

    while (x-- > 0)
        printf("%d",x);

    return 0;
}

输出将是:

1
9 8 7 6 5 4 3 2 1 0

实际上,x是后递减的,并且正在检查这种情况。不是-->,是(x--) > 0

注:检查条件后,x的值发生变化,因为它是后递减的。也可能出现一些类似的情况,例如:

1
2
3
4
-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0


C和C++遵循"最大MunCH"规则。同样地,a---b被翻译成(a--) - b,在你的例子中,x-->0被翻译成(x--)>0

规则的实质是从左到右,表达式是由最多个字符组成的,这些字符将构成一个有效的表达式。


为什么这么复杂?

原始问题的简单答案是:

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

做同样的事。不是说你应该这样做,但它做了同样的事情,并且会在一个帖子里回答这个问题。

x--只是上面的简写,>只是比operator大的一个正常值。没什么大不了的!

现在有太多人把简单的事情变得复杂了;)


传统的方法是在while循环中定义条件圆括号"EDOCX1"(6),在括号"EDOCX1"(7)中定义终止条件,但是这个--&>是一种同时定义所有条件的方法。例如:

1
2
3
4
5
6
int abc(){
    int a = 5
    while((a--) > 0){ // Decrement and comparison both at once
        // Code
    }
}

它说,减少a并运行循环,直到a大于0时为止。

另一种方式应该是:

1
2
3
4
5
6
7
int abc(){
    int a = 5
    while(a > 0){
        // Code
        a = a -1 // Decrement inside loop
    }
}

两种方式,我们都做同样的事情,实现同样的目标。