9675

でC++/ STLの隠し機能とダークコーナーを読んだ後comp.lang.c++.moderated、次のスニペットがVisualStudio2008と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

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

4

29 に答える 29

9378

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

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

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

while( (x--) > 0 )
于 2009-10-29T07:00:09.617 に答える
3627

または、まったく異なるものについては...xにスライドし0ます。

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

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

于 2012-01-18T11:18:08.440 に答える
2519

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

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

于 2009-10-29T08:38:08.740 に答える
1563

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

;)

于 2014-12-28T00:32:03.527 に答える
1392

と同等です

while (x-- > 0)

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

while(x > 0) {
    x = x-1;
    // logic
}
x--;   // The post decrement done when x <= 0
于 2009-10-29T07:00:13.097 に答える
593

これは

#include <stdio.h>

int main(void) {
  int x = 10;
  while (x-- > 0) { // x goes to 0
    printf("%d ", x);
  }
  return 0;
}

スペースだけで物事が面白く見え、--減少し、>比較されます。

于 2009-10-29T07:00:19.180 に答える
472

の使用法に-->は歴史的な関連性があります。デクリメントは、x86アーキテクチャでのインクリメントよりも高速でした(場合によってはまだです)。を使用すると、それが行われることを-->示唆し、数学的なバックグラウンドを持つ人々にアピールします。x0

于 2009-11-18T12:47:41.253 に答える
414

まったくオタクですが、私はこれを使用します:

#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;
}
于 2010-05-18T20:33:28.117 に答える
399
while( x-- > 0 )

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

于 2009-10-29T07:00:20.880 に答える
347

私が読んだある本(どの本を正しく覚えていないか)は次のように述べています。コンパイラは、左右のルールを使用して式を最大のトークンに解析しようとします。

この場合、式:

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
于 2010-04-09T00:04:09.040 に答える
291

これはまったく同じです

while (x--)
于 2009-12-31T13:48:19.947 に答える
258

とにかく、今は「goesto」演算子があります。"-->"方向として覚えやすいです、そして「xがゼロになる間」は意味-まっすぐです。

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

于 2009-10-29T14:45:22.637 に答える
234

このコードは、最初に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
于 2009-11-18T12:52:03.290 に答える
193

このコードを実行すると、コンパイラは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になる間」のように見えるのは良いことです。

于 2010-01-17T00:46:01.193 に答える
159

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

于 2009-12-28T16:32:54.157 に答える
149

--デクリメント演算子で>あり、より大きい演算子です。

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

于 2010-04-06T10:45:37.610 に答える
140

これは、2つの演算子の組み合わせです。1つ--は値をデクリメントするためのもので>、値が右側のオペランドより大きいかどうかをチェックするためのものです。

#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            
于 2013-04-02T11:22:40.140 に答える
131

CおよびC++は、「最大ムンク」ルールに従います。同じ方法a---bがに変換さ(a--) - bれます。あなたの場合 はx-->0に変換されます(x--)>0

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

于 2014-02-10T17:29:22.903 に答える
130

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

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

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0
于 2012-08-18T07:34:12.943 に答える
33

なぜすべての合併症?

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

#include <stdio.h>

int main()
{
    int x = 10;
    while (x > 0)
    {
        printf("%d ", x);
        x = x-1;
    }
}

同じことをします。私はあなたがこのようにすべきだと言っているのではありませんが、それは同じことをし、1つの投稿で質問に答えたでしょう。

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

最近は単純なことを複雑にする人が多すぎます;)

于 2016-10-27T15:09:20.750 に答える
30

従来の方法では、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
    }
}

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

于 2017-05-28T20:10:34.777 に答える
27
char sep = '\n'  /1\
; int i = 68    /1  \
; while (i  ---      1\
                       \
                       /1/1/1                               /1\
                                                            /1\
                                                            /1\
                                                            /1\
                                                            /1\
                            /           1\
                           /            1 \
                          /             1  \
                         /              1   \
                         /1            /1    \
                          /1          /1      \
                           /1        /1        /1/1> 0) std::cout \
                              <<i<<                               sep;

数値が大きい場合、C++20ではより高度なループ機能が導入されています。最初にキャッチiするために、逆ループデループを構築し、それをに偏向させることができますstd::ostream。ただし、の速度iは実装によって定義されるため、新しいC++20速度演算子を使用<<i<<して速度を上げることができます。また、壁を構築することによってそれをキャッチする必要があります。そうでない場合iは、スコープを離れ、参照を解除すると未定義の動作が発生します。セパレータを指定するには、次を使用できます。

 std::cout \
           sep

67から1へのforループがあります。

于 2021-01-23T07:32:43.550 に答える
25

(x --> 0)を意味し(x-- > 0)ます。

  1. 使用できます(x -->)
    Output: 9 8 7 6 5 4 3 2 1 0
  1. あなたが使うことができます(-- x > 0) それは意味です(--x > 0)
    Output: 9 8 7 6 5 4 3 2 1
  1. 使用できます
(--\
    \
     x > 0)

Output: 9 8 7 6 5 4 3 2 1

  1. 使用できます
(\
  \
   x --> 0)

Output: 9 8 7 6 5 4 3 2 1 0

  1. 使用できます
(\
  \
   x --> 0
          \
           \
            )

Output: 9 8 7 6 5 4 3 2 1 0

  1. あなたも使うことができます
(
 x 
  --> 
      0
       )

Output: 9 8 7 6 5 4 3 2 1 0

同様に、このコマンドを正常に実行するために多くの方法を試すことができます。

于 2019-09-23T12:39:00.043 に答える
20

通常の矢印演算子(->)の代わりに、徹甲矢印演算子を使用できます:--x>(矢印の先端にある鋭い棘に注意してください)。徹甲弾に+1が追加されるため、通常の矢印演算子よりもループ1回の反復が速く終了します。自分で試してみてください:

int x = 10;
while( --x> 0 )
    printf("%d ", x);
于 2021-06-03T20:01:38.323 に答える
7

実際には、楽しみのために->演算子を「作成」することができます)

class MyClass {
    class Helper
    {
        MyClass* ptr;
        Helper(MyClass* _this): ptr{_this} {}
    public:
        Helper(const Helper&) = delete;
        Helper(Helper&&) = delete;
        void operator=(const Helper&) = delete;
        void operator=(Helper&&) = delete;
        operator MyClass()
        {
            auto tmp = *ptr;
            tmp._value++;
            return tmp;
        }
        friend MyClass;
        void operator>(int){std::cout << "Operator -->" << std::endl;}
    };

    int _value = 0;
public:
    MyClass() = default;
    MyClass(int value): _value{value} {}
    Helper operator--(int)
    {
        _value--;
        return Helper(this);
    }
    int get() const noexcept
    {
        return _value;
    }
    bool operator>(int num) const noexcept
    {
        return _value > num; 
    }
};

int main()
{
    MyClass obj(5);
    obj > 1;            //operator >
    obj--;              //operator --
    MyClass b = obj--;  //still works
    std::cout << b.get() << std::endl;      //4
    std::cout << obj.get() << std::endl;    //3
    b --> 5;            //operator -->
    //But there is at least one problem
    auto c = obj--;     //auto can deduce a private type :(
}

しかし、私が言ったように、それは楽しみのためだけです;)

于 2021-07-01T13:21:38.490 に答える
4

これ-->はオペレーターではありません。のような演算子がありますが、のような演算子はあり->ません-->while(x-- >0)これは、 xにポストデクリメント演算子があり、このループがゼロより大きくなるまで実行されることを意味するという誤った解釈です。

このコードを書く別の簡単な方法はですwhile(x--)whileループは、false条件を取得するたびに停止します。 ここでは、ケースが1つだけあり0ます。したがって、x値がゼロにデクリメントされると停止します。

于 2020-06-15T18:15:17.883 に答える
4

--これが単項ポストデクリメント演算子です。

 while (x-- > 0) // x goes to 0
 {
     printf("%d ", x);
 }
  • 最初は、条件は次のように評価されます (x > 0) // 10 > 0
  • 条件が真であるため、値が減少してループに入ります。 x-- // x = 9
  • そのため、最初に出力される値は9です。
  • 等々。最後のループx=1では、条件は真です。単項演算子に従って、値x = 0は印刷時にに変更されました。
  • ここでx = 0、は条件(x > 0 )をfalseと評価し、whileループが終了します。
于 2020-07-06T11:28:09.783 に答える
3

-->は演算子ではなく、--(デクリメント後)と>(比較よりも大きい)の並置です。

ループは次のようによりよく知られています。

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

10このループは、 (除外された上限)と含まれた下限の間の値を列挙するための古典的なイディオム0であり、配列の要素を最後から最初まで反復するのに役立ちます。

初期値10は、反復の総数(たとえば、配列の長さ)であり、1にループ内で使用される最初の値を加えたものです。はループ内0の最後の値であるため、コメントxは0になりますx

xループが完了した後の値は。であることに注意してください-1

のような符号なし型がある場合、このループは同じように動作することにも注意してください。これは、単純な代替手段よりも強力な利点です。xsize_tfor (i = length-1; i >= 0; i--)

このため、私は実際にはこの驚くべき構文のファンですwhile (x --> 0)for (;;)このイディオムは、 vs:と同じように、人目を引くエレガントなものだと思いますwhile (1)(これは紛らわしいことに似ていますwhile (l))。また、構文がCに触発された他の言語でも機能します。たとえば、C ++、Objective-C、java、javascript、C#などです。

于 2021-03-12T12:44:08.810 に答える
1

それがあなたの言いたいことです。

while((x--) > 0)

子供の頃に聞いた、

やめないで、手放す(روکومت،جانےدو)

コンマが混乱する場所

やめて、手放さないで。(روکو،متجانےدو)

プログラミングでも同じことが起こりますが、スペースは混乱を招きます。:D

于 2021-06-02T05:47:18.877 に答える