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 )
それともまったく違う何かのために... xは0にスライドする
while (x --\
\
\
\
> 0)
printf("%d ", x);
それほど数学的ではありませんが、...すべての絵が千の言葉を描きます...
これは非常に複雑な演算子であるため、 ISO/IEC JTC1(Joint Technical Committee 1) C++標準の2つの異なる部分に説明を追加しています。
冗談はさておき、それらは2つの異なる演算子です:--
と>
はそれぞれC++ 03標準の§5.2.6/ 2と§5.9で説明されています。
それと同等です
while (x-- > 0)
x--
(ポストデクリメント)はx = x-1
と同等です。そのため、コードは次のように変換されます。
while(x > 0) {
x = x-1;
// logic
}
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);
}
負でない数の場合
とにかく、私たちには "行ける"オペレータがいます。 "-->"
は方向として覚えるのが簡単です、そして「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つの演算子は-->
のように単一のものとして適用されます。
これは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
実際、x
はポストデクリメントしており、その状態でチェックされています。 -->
ではなく、(x--) > 0
です
注:x
の値は、条件がチェックされた後に変更されます。これは、ポストデクリメントが行われるためです。たとえば、次のような場合もあります。
--> x-->0
++> x++>0
-->= 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(){
int a = 5
while((a--) > 0){ // Decrement and comparison both at once
// Code
}
}
a
をデクリメントし、a
が0
より大きくなるまでループを実行します。
他の方法はそれがあったはずだった:
int abc() {
int a = 5;
while(a > 0) {
a = a -1 // Decrement inside loop
// Code
}
}
どちらの方法でも、同じことを行い、同じ目標を達成します。