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

在阅读完comp.lang.c++.moderated的 C ++ / STL 的隐藏功能和 “黑暗角落” 后 ,我完全感到惊讶的是,以下代码段在 Visual Studio 2008 和 G ++ 4.4 中均已编译并正常工作。

这是代码:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}

输出:

9 8 7 6 5 4 3 2 1 0

我认为这是 C,因为它也可以在 gcc 中使用。该标准在哪里定义,以及它来自何处?

答案

-->不是运算符。实际上,它是两个单独的运算符-->

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

为了更好地理解,该语句可以编写如下:

while( (x--) > 0 )

或者对于完全不同的东西... x滑到0

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

并不是那么数学,但是... 每张画都画一千个单词...

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

除了开玩笑,它们是两个不同的运算符: -->分别在 C ++ 03 标准的第 5.2.6 / 2 节和第 5.9 节中进行了描述。

相当于

while (x-- > 0)

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

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

x可以在相反的方向更快地变为零:

int x = 10;

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

8 6 4 2

您可以用箭头控制速度!

int x = 100;

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

90 80 70 60 50 40 30 20 10

;)

它的

#include <stdio.h>
int main(void){
     int x = 10;

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

       printf("%d ", x);
     }

     return 0;
}

就在空间让事情看起来滑稽, --递减和>进行比较。

-->的用法具有历史意义。减少(在某些情况下仍然是)比在 x86 架构上增加要快。使用-->表示x即将变为0 ,并且吸引那些具有数学背景的人。

while( x-- > 0 )

是这样解析的。

极客,但我会用这个:

#define as ;while

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

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

在这种情况下,表达式:

x-->0

解析为最大令牌:

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

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

a-----b

解析后:

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

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