2016-12-18 3 views
2

私はループがどのように機能するかを理解しています。しかし、異なる構文は私に問題を引き起こします...あなたに例を挙げてみましょう:Cのループについて困惑しました

私は再帰ソートアルゴリズム(挿入ソート)を探していました。

void insertion_recursive(int array[],int size){ 
int i; 

if (size<=1) return; 

insertion_recursive(array,size-1); 

for(i=size-1;i;i--) 
    if(array[i]<array[i-1]) 
     swap(&array[i],&array[i-1]); 
    else 
     break; 
} 

私は、コードがどのように動作するかを理解しますが、ループの条件が私を混乱されています:

for(i=size-1 ; i ; i--) 

それが何を意味するコードは次のように行ってきましたか?条件を指定せずに「私」を残すだけですか?

+3

にしかし、それは* *条件を持っていません!ちょうど 'if(i)... 'のように。 – usr2564301

+1

「0」は「偽」であり、他の値は「真」である。 –

+0

_ループの仕組みを理解しています_あなたがしたのであれば質問しません。 'i'が0のときはfalse、そうでなければ真です –

答えて

2

式は単一のデータ項目を表します。通常は数値です。表現は、constantまたはvariableのような単一のエンティティから構成されてもよく、または1つまたは複数のオペレータによって相互接続されたそのようなエンティティのいくつかの組み合わせから構成されてもよい。式は、trueまたはfalseの論理条件を表すこともできます。しかしながら、Cにおいて、条件trueおよびfalseは、非ゼロ整数値およびゼロ整数値によってそれぞれ表される。いくつかの簡単な式は以下の通りである:あなたの例では

a + b 
x = y 
t = u + v 
x <= y 
++j 

を、i、その値はこのケースであり、式のl-valueで表現され、それは変数iの値です。 iの値が0の場合、式はi値ではtrue、評価値ではfalseと評価されます。

したがって、for(i=(size-1); i ; i--)for(i=(size-1); i != 0; i--)に相当します。

+0

私は、0以外の値についてconditionをtrueに評価します...私はそれを認識していませんでした。これもうまくいくはずです:for(i = size-1; i> 0; i--) –

0

iは、それ自体がif (i) {...}またはif (! i) {...}と同様のブール値に変換されます。 0以外の場合はtrue、ゼロの場合はfalseとみなされます。

したがって、for(i=size-1 ; i ; i--)for(i=size-1 ; i != 0; i--)に相当します。

+0

Cはものをbooleanに変換しますか? –

+0

それは修辞的な質問でした –

+0

それ自身では 'i'はブール値に変換されません。 –

2

Cでは、条件を評価しようとすると、0はすべて偽であり、その他はすべて真です。

ポインタも同様に扱われます。定数のNULLは実際には0と定義されています.C++ 11では、最終的に型安全性のためにnull_ptrがあります。 Cでは

そこにはbool型はされていない、とあなたは整数に真のキャスト場合はC++であなたは1を取得し、偽のキャスト0

関連する問題