C++中的“->”運算符是什麼?



c++符號 (14)

comp.lang.c++.moderated上閱讀C ++ / STL的Hidden Features和Dark Corners後 ,我完全驚訝於以下代碼片段在Visual Studio 2008和G ++ 4.4中編譯和工作。

這是代碼:

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

我假設這是C,因為它也適用於GCC。 標準中定義了哪裡,它來自何處?

https://src-bin.com


Answer #1

請注意

-->不是運營商。 它實際上是兩個獨立的運算符, -->

條件的代碼遞減x ,同時返回x的原始(未遞減)值,然後使用>運算符將原始值與0進行比較。

為了更好地理解,該聲明可以寫成如下:

while((x--) > 0)

Answer #2

CC++遵守“最大蒙克”規則。 同樣的方式a --- b被翻譯成(a--) - b ,在你的情況下, x-->0轉換為(x--)>0

規則本質上是從左到右,表達式是通過獲取將形成有效表達式的最大字符來形成的。


Answer #3

-->之間缺少空格。 x後遞減,即在檢查條件x>0 ?後遞減x>0 ?


Answer #4

--遞減運算符, >大於運算符。

這兩個運算符作為單個運算符應用,如-->


Answer #5

傳統方式我們在while循環括號“ () ”中定義條件並在大括號“ {} ”內終止條件,但是這個-->是一種定義所有一次的方式。 例如:

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

它說,減少並運行循環直到時間a大於0

其他方式應該是這樣的:

int abc(){
    int a = 5
    while(a > 0){
        // Code
        a = a -1 // Decrement inside loop
    }
}

兩種方式,我們做同樣的事情,實現相同的目標。


Answer #6

它是兩個運營商的組合。 第一個--用於遞減值, >用於檢查該值是否大於右側操作數。

#include<stdio.h>

int main()
{
    int x = 10;

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

    return 0;
}

輸出將是:

9 8 7 6 5 4 3 2 1 0            

Answer #7

它相當於

while (x-- > 0)

x-- (後遞減)相當於x = x-1所以,代碼轉換為:

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

Answer #8

完全是極客,但我將使用這個:

#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;
}

Answer #9

我讀過的一本書(我記不清哪本書)說明: 編譯器嘗試使用左右規則將表達式解析為最大的標記

在這種情況下,表達式:

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

我希望這有助於理解複雜的表達式^^


Answer #10

或者對於完全不同的東西... x幻燈片到0

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

不是那麼數學,但......每張圖片都描繪了千言萬語......


Answer #11

為什麼所有的並發症?

原始問題的簡單答案就是:

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

做同樣的事情。 不是說你應該這樣做,但它做同樣的事情並且會在一篇文章中回答這個問題。

x--只是上述的簡寫, >只是一個普通的大於operator 。 沒什麼大不了的!

現在有太多的人把簡單的事情弄複雜了;)


Answer #12

無論如何,我們現在有一個“去”操作員。 "-->"很容易被記住作為一個方向,而“當x變為零”意味著 - 直。

此外,它在某些平台上比"for (x = 10; x > 0; x --)"更有效。


Answer #13

這是一個非常複雜的操作員,因此即使ISO / IEC JTC1(聯合技術委員會1)也將其描述放在C ++標準的兩個不同部分。

開玩笑說,它們是兩個不同的運算符: -->分別在C ++ 03標準的§5.2.6/ 2和§5.9中描述。


Answer #14

運行此代碼時,我的編譯器將打印出9876543210。

#include <iostream>
int main()
{
    int x = 10;

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

正如所料。 while( x-- > 0 )實際上意味著while( x > 0)x-- post遞減x

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

是一種不同的寫作方式。

雖然原來看起來像“雖然x變為0”但很好。





standards-compliance