読んだ後に隠された機能と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だと思います。これは規格のどこで定義されており、どこから来たのですか?
-->
は演算子ではありません。実際には、2つの別々の演算子--
と>
。
条件文のコードはx
、x
の元の(デクリメントされていない)値を返しながらデクリメントし、次に元の値を演算子の0
使用と比較します>
。
理解を深めるために、ステートメントは次のように書くことができます。
while( (x--) > 0 )
または、まったく異なるものについては...にx
スライドし0
ます。
while (x --\
\
\
\
> 0)
printf("%d ", x);
それほど数学的ではありませんが...すべての絵は千の言葉を描きます...
これは非常に複雑な演算子であるため、ISO / IEC JTC1(Joint Technical Committee 1)でさえ、その説明をC ++標準の2つの異なる部分に配置しました。
冗談はさておき、彼らは、二つの異なる演算子であり:--
及び>
§5.2.6/ 2とC ++ 03標準の§5.9にそれぞれ記載しました。
と同等です
while (x-- > 0)
x--
(ポストデクリメント)はx = x-1
soと同等であり、コードは次のように変換されます。
while(x > 0) {
x = x-1;
// logic
}
x--; // The post decrement done when x <= 0
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
;)
それは
#include <stdio.h>
int main(void) {
int x = 10;
while (x-- > 0) { // x goes to 0
printf("%d ", x);
}
return 0;
}
スペースだけで物事が面白く見え、--
減少し、>
比較されます。
の使用法に-->
は歴史的な関連性があります。デクリメントは、x86アーキテクチャでのインクリメントよりも高速でした(そして、場合によってはまだ高速です)。を使用-->
すると、それx
が行われることを示唆し0
、数学的な背景を持つ人々にアピールします。
while( x-- > 0 )
それがどのように解析されるかです。
まったくオタクですが、私はこれを使用します:
#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
最大のトークンへの解析:
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
これが複雑な表現を理解するのに役立つことを願っています^^
これはまったく同じです
while (x--)
{
printf("%d ", x);
}
非負の数の場合
とにかく、今は「goesto」演算子があります。"-->"
方向として覚えやすいです、そして「xがゼロになる間」は意味-まっすぐです。
さらに、"for (x = 10; x > 0; x --)"
一部のプラットフォームよりも少し効率的です。
このコードは、最初に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
このコードを実行すると、コンパイラは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になる間」のように見えるのはいいことです。
--
との間にスペースがありません>
。x
ポストデクリメントされます。つまり、条件をチェックした後にデクリメントされますx>0 ?
。
--
はデクリメント演算子で>
あり、大なり記号演算子です。
2つの演算子は、のように1つの演算子として適用され-->
ます。
これは、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
実際にx
は、ポストデクリメントであり、その状態でチェックされています。それはそうではありません-->
、それは(x--) > 0
注:の値はx
、ポストデクリメントされるため、条件がチェックされた後に変更されます。同様のケースも発生する可能性があります。たとえば、次のとおりです。
--> x-->0
++> x++>0
-->= x-->=0
++>= x++>=0
CおよびC ++は、「最大ムンク」ルールに従います。同様のA --- Bがに翻訳され(a--) - b
、あなたのケースでは、x-->0
に変換します(x--)>0
。
ルールが本質的に言っていることは、左から右に行くと、式は有効な式を形成する文字の最大数を取ることによって形成されるということです。
なぜすべての合併症?
元の質問に対する簡単な答えは次のとおりです。
#include <stdio.h>
int main()
{
int x = 10;
while (x > 0)
{
printf("%d ", x);
x = x-1;
}
}
それは同じことをします。私はあなたがこのようにすべきだと言っているのではありませんが、それは同じことをし、1つの投稿で質問に答えたでしょう。
x--
上記のためだけ速記であり、>
普通より大ですoperator
。大きな謎はありません!
最近は単純なことを複雑にする人が多すぎます;)
従来の方法では、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--;
}
どちらの方法でも、私たちは同じことを行い、同じ目標を達成します。
(x --> 0)
を意味し(x-- > 0)
ます。
(x -->)
Output: 9 8 7 6 5 4 3 2 1 0
(-- x > 0)
それは意味です(--x > 0)
Output: 9 8 7 6 5 4 3 2 1
(--\
\
x > 0)
Output: 9 8 7 6 5 4 3 2 1
(\
\
x --> 0)
Output: 9 8 7 6 5 4 3 2 1 0
(\
\
x --> 0
\
\
)
Output: 9 8 7 6 5 4 3 2 1 0
(
x
-->
0
)
Output: 9 8 7 6 5 4 3 2 1 0
同様に、このコマンドを正常に実行するために多くの方法を試すことができます。
これ--
が単項ポストデクリメント演算子です。
while (x-- > 0) // x goes to 0
{
printf("%d ", x);
}
(x > 0) // 10 > 0
x-- // x = 9
x=1
では、条件は真です。単項演算子に従って、値x = 0
は印刷時にに変更されました。x = 0
、は条件(x > 0 )
をfalseと評価し、whileループが終了します。これ-->
はオペレーターではありません。のような演算子がありますが->
、のような演算子はありません-->
。これは単に間違った解釈でwhile(x-- >0)
あり、xにポストデクリメント演算子があり、このループはゼロより大きくなるまで実行されます。
このコードを書く別の簡単な方法はwhile(x--)
です。しばらくの間、それは偽の条件を取得し、ここで一つだけの場合があるたびループは、すなわち、停止します0
。したがって、x値がゼロにデクリメントされると停止します。
特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。
ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。
ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。
画像クレジット:Richard Mackney / Flickrトラベリングライトは必需品だけを運ぶことを意味するかもしれませんが、デバイスを補充する方法がない外出先では、接続を維持するのが難しくなる可能性があります。それはあなたがすべての生き物の快適さやクールなガジェットを捨てる必要があるという意味ではありません、ただあなたがいくつかのより小さなものを手に入れる必要があるということです、そしておそらくあなた自身をジュースに保つためにいくつかの、例えば非正統的な充電装置を使うでしょう。
ニューヨーク州スプリンググレンにある放棄されたホモワックロッジのボーリング場。キャッツキル南部のこの地域は、ニューヨーク市からのユダヤ人の行楽客に人気があることから、かつてはボルシチベルトとして知られていました。
ブルックリンスレートブルックリンスレートのマグカップとコースターの賞賛をすでに歌っており、それらの食器製品も同様に堅実です。ブルックリンスレートは、さまざまなサイズとテクスチャのスレートの完全な採石場を販売しています。一部のオプションは赤でも利用できます。上で見ることができるように、彼らは同様にカスタマイズをします。
画像:Juan Gaertner / Shutterstock私たちの体の内部は、私たちの細胞とは何の関係もない何十億もの微生物が住んでいる本物の生態系です。これがまだ少し気になることではなかったかのように、これらの微生物の99%が研究されたことがないことがわかりました。
Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday
シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。
オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。
Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。
遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。
2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。
計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。