<= c++




C++の "->"演算子は何ですか? (14)

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

私はGCCでも同様に動作するので、これはCであると仮定します。 これは標準でどこに定義されていますか?


注意を払う

-->演算子ではありません。 実際には2つの別々の演算子-->ます。

条件付きのコードは、 xの元の(デクリメントされていない)値を返しながらx減分し、 >演算子を使用して元の値を0と比較します。

理解を深めるために、この声明は次のように書くことができます:

while((x--) > 0)

CC++は "最大の不作為"ルールに従います。 a --- bが(a--) - bに変換されるのと同じ方法で、 x-->0(x--)>0変換され(x--)>0

ルールが本質的に言っていることは、左から右に向かっていくことです。表現は、有効な表現を形成する文字の最大値を取ることによって形成されます。


-->間にスペースがありません。 xはポストデクリメントされます。つまり、 x>0 ?条件を確認した後にデクリメントされx>0 ?


--減分演算子で、 >より大きい演算子です。

2つの演算子は-->ような単一のものとして適用されます。


かなりオタクですが、私はこれを使用します:

#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を比較し、次にxを減分します。 (また、最初の答えで言った:あなたはxを後減少させ、次にxと0を>演算子と比較します。)このコードの出力を参照してください:

9 8 7 6 5 4 3 2 1 0

今度は、まず出力を見ることで比較してから減らします。

最初に減らしてから比較する場合は、次のコードを使用します。

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

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

その出力は次のとおりです。

9 8 7 6 5 4 3 2 1

これはまったく同じです

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

負でない数字の場合


それは

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

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

       printf("%d ", x);
     }

     return 0;
}

ちょうどスペースが物事を面白く見せる--デクリメントと比較する。



とにかく、私たちは現在 "行く"演算子を持っています。 "-->"は方向として記憶されやすく、 "xは0になる"という意味 - ストレートです。

さらに、一部のプラットフォームでは"for (x = 10; x > 0; x --)"よりも少し効率的です。


または、全く別のもの... xスライドを0にする

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

それほど数学的ではありませんが、すべての絵は千の言葉を描きます...


実際には、 xはポストデクリメントされ、その状態がチェックされています。 それはではない-->(x--) > 0 --> (x--) > 0

注: x値は、条件がチェックされた後に、ポストデクリメントするために変更されます。 いくつかの同様のケースが発生する可能性があります。たとえば、

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0

私が読んだ1冊の本(私はどの本が正しいか覚えていない): コンパイラは左の規則を使って最大のトークンに式を解析しようとします

この場合、式は次のようになります。

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

これが複雑な表現を理解するのに役立ちますね^^


私のコンパイラは、このコードを実行すると9876543210を出力します。

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

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

予想通り。 while( x > 0) while( x-- > 0 )実際にはwhile( x > 0)意味while( x > 0)ます。 x-- x減分する。

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

同じことを書く別の方法です。

しかし、オリジナルが "xが0になる間"のように見えるのはいいことです。





standards-compliance