C ++の「->」演算子とは何ですか?

9205
GManNickG 2009-10-29 20:57.

読んだ後に隠された機能とCのダークコーナー++ / STLのをcomp.lang.c++.moderated、私は完全に次のコードがコンパイルおよび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

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

24 answers

8893
Potatoswatter 2009-10-29 21:00.

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

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

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

while( (x--) > 0 )
3289
unsynchronized 2012-01-19 01:18.

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

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

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

2420
Kirill V. Lyadvinsky 2009-10-29 22:38.

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

冗談はさておき、彼らは、二つの異なる演算子であり:--及び>§5.2.6/ 2とC ++ 03標準の§5.9にそれぞれ記載しました。

1311
Shubham 2009-10-29 21:00.

と同等です

while (x-- > 0)

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

while(x > 0) {
    x = x-1;
    // logic
}
x--;   // The post decrement done when x <= 0
1275
doc 2014-12-28 14:32.

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

;)

563
RageZ 2009-10-29 21:00.

それは

#include <stdio.h>

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

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

442
Matt Joiner 2009-11-19 02:47.

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

377
Grumdrig 2009-10-29 21:00.
while( x-- > 0 )

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

375
3 revs, 2 users 76% Arrieta 2010-05-19 10:33.

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

#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;
}
325
NguyenDat 2010-04-09 14:04.

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

この場合、式:

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

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

280
Good Person 2010-01-01 03:48.

これはまったく同じです

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

非負の数の場合

246
Test 2009-10-30 04:45.

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

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

224
SjB 2009-11-19 02:52.

このコードは、最初に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
182
cool_me5000 2010-01-17 14:46.

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

151
2 revs, 2 users 50% Mr. X 2009-12-29 06:32.

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

142
muntoo 2010-04-07 00:45.

--デクリメント演算子で>あり、大なり記号演算子です。

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

132
Rajeev Das 2013-04-03 01:22.

これは、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            
123
AndroidLearner 2012-08-18 21:34.

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

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

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0
122
Peter Mortensen 2014-02-11 07:29.

CおよびC ++は、「最大ムンク」ルールに従います。同様のA --- Bがに翻訳され(a--) - b、あなたのケースでは、x-->0に変換します(x--)>0

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

29
Garry_G 2016-10-28 05:09.

なぜすべての合併症?

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

#include <stdio.h>

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

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

x--上記のためだけ速記であり、>普通より大ですoperator。大きな謎はありません!

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

27
Zohaib Ejaz 2017-05-29 10:10.

従来の方法では、whileループ括弧内の()条件と中括弧内の終了条件を定義します{}-->、両方を同時に定義します。

例えば:

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

これaは、aがより大きい間、ループをデクリメントして実行します0

従来は、次のようになります。

int abc(void)
{
    int a = 5;
    while(a > 0)
    {
        a--;
        // Code
    }
    a--;
}

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

14
Kalana 2019-09-24 02:39.

(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

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

2
Neeraj Bansal 2020-07-07 01:28.

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

 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ループが終了します。
1
Peter Mortensen 2020-06-16 08:15.

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

このコードを書く別の簡単な方法はwhile(x--)です。しばらくの間、それは偽の条件を取得し、ここで一つだけの場合があるたびループは、すなわち、停止します0。したがって、x値がゼロにデクリメントされると停止します

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

この太陽に優しいショルダーバッグで一日中外出してください

この太陽に優しいショルダーバッグで一日中外出してください

画像クレジット:Richard Mackney / Flickrトラベリングライトは必需品だけを運ぶことを意味するかもしれませんが、デバイスを補充する方法がない外出先では、接続を維持するのが難しくなる可能性があります。それはあなたがすべての生き物の快適さやクールなガジェットを捨てる必要があるという意味ではありません、ただあなたがいくつかのより小さなものを手に入れる必要があるということです、そしておそらくあなた自身をジュースに保つためにいくつかの、例えば非正統的な充電装置を使うでしょう。

ミッドセンチュリーリゾートのポストカードが廃墟に変わるのを見る

ミッドセンチュリーリゾートのポストカードが廃墟に変わるのを見る

ニューヨーク州スプリンググレンにある放棄されたホモワックロッジのボーリング場。キャッツキル南部のこの地域は、ニューヨーク市からのユダヤ人の行楽客に人気があることから、かつてはボルシチベルトとして知られていました。

ブルックリンスレートの美しいボードをあなたのテーブルに座らせましょう

ブルックリンスレートの美しいボードをあなたのテーブルに座らせましょう

ブルックリンスレートブルックリンスレートのマグカップとコースターの賞賛をすでに歌っており、それらの食器製品も同様に堅実です。ブルックリンスレートは、さまざまなサイズとテクスチャのスレートの完全な採石場を販売しています。一部のオプションは赤でも利用できます。上で見ることができるように、彼らは同様にカスタマイズをします。

遺伝子分析により、私たちの体内に生息する微生物の99%がカタログ化されていないことが明らかになりました

遺伝子分析により、私たちの体内に生息する微生物の99%がカタログ化されていないことが明らかになりました

画像:Juan Gaertner / Shutterstock私たちの体の内部は、私たちの細胞とは何の関係もない何十億もの微生物が住んでいる本物の生態系です。これがまだ少し気になることではなかったかのように、これらの微生物の99%が研究されたことがないことがわかりました。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language