web-dev-qa-db-ja.com

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

GCCでも機能するので、これはCだと思います。これは規格のどこで定義されていますか、そしてどこから来ましたか?

8282
GManNickG

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

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

理解を深めるために、このステートメントは次のように書くことができます。

while( (x--) > 0 )
7974
Charles Salvia

それともまったく違う何かのために... xは0にスライドする

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

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

2737
unsynchronized

これは非常に複雑な演算子であるため、 ISO/IEC JTC1(Joint Technical Committee 1) C++標準の2つの異なる部分に説明を追加しています。

冗談はさておき、それらは2つの異なる演算子です:-->はそれぞれC++ 03標準の§5.2.6/ 2と§5.9で説明されています。

2297

それと同等です

while (x-- > 0)

x--(ポストデクリメント)はx = x-1と同等です。そのため、コードは次のように変換されます。

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

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

;)

1034
doc

それは

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

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

       printf("%d ", x);
     }

     return 0;
}

スペースだけで物事が面白くなり、--が減少し、>が比較します。

524
RageZ

-->の使い方は歴史的な意味を持ちます。デクリメントは、x86アーキテクチャでのインクリメントよりも高速でした(そして、場合によってはそうなっています)。 -->を使用することは、x0になることを示唆しており、数学的背景を持っている人には魅力的です。

395
Matt Joiner
while( x-- > 0 )

それがどのように解析されるかです。

343
Grumdrig

全くオタクですが、私はこれを使用します。

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

私が読んだある本(私はどちらの本を正しく覚えていないか)を述べました: コンパイラは左右のルールを使って式を最大のトークンにパースしようとします

この場合、式は

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

これが複雑な表現を理解するのに役立つことを願っています^^

302
NguyenDat

これはまったく同じです。

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

負でない数の場合

252
Good Person

とにかく、私たちには "行ける"オペレータがいます。 "-->"は方向として覚えるのが簡単です、そして「xがゼロになる間に」はまっすぐな意味です。

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

230
Test

このコードは、最初にxと0を比較してからxをデクリメントします。 (また、最初の答えで言った:あなたはxをポストデクリメントしてから、xと0を>演算子で比較している。)このコードの出力を見てください:

9 8 7 6 5 4 3 2 1 0

最初に比較してから、出力に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
212
Sajad Bahmani

このコードを実行すると、私のコンパイラは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--投稿はxをデクリメントします。

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

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

オリジナルが「xが0になるまで」のように見えるのはいいことです。

167
cool_me5000

-->の間にスペースがありません。 xは、ポストデクリメント、つまり条件x>0 ?のチェック後にデクリメントされます。

138
Mr. X

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

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

129
sam

これは2つの演算子の組み合わせです。最初の--は値を減らすためのもので、>はその値が右側のオペランドより大きいかどうかを調べるためのものです。

#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            
123
Rajeev Das

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

注:xの値は、条件がチェックされた後に変更されます。これは、ポストデクリメントが行われるためです。たとえば、次のような場合もあります。

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0
117
AndroidLearner

_ c _ および C++ は、 "最大マンチ"の規則に従います。 a --- bが(a--) - bに変換されるのと同じように、あなたの場合x-->0(x--)>0に変換されます。

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

113
Pandrei

なぜすべての面倒なのか

元の質問に対する簡単な答えは、次のとおりです。

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

同じことをします。このようにするべきだと言っていないが、それは同じことをし、1つの記事で質問に答えたであろう。

x--は上記の略語であり、>は単なる通常のoperatorより大きい値です。大きな謎はありません!

今日では、単純なことを複雑にしている人が多すぎます。

26
Garry_G

慣例的にwhileループの括弧 "()"と中括弧内の終了条件 "{}"で条件を定義しますが、この-->は一度にすべてを定義する方法です。例えば:

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

aをデクリメントし、a0より大きくなるまでループを実行します。

他の方法はそれがあったはずだった:

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

どちらの方法でも、同じことを行い、同じ目標を達成します。

23
Zohaib Ejaz