2017-03-28 11 views
1

ながら、私は、字句解析器のコードを見ていたし、私はこれに出くわした:C(偽)ループ

while ("false") 
{ 
    c = fgetc(f); 
    switch (state) 
    ... 

私はそれが正しい結果を生成し、それとのコードの動作をテストしました。 falseの条件がある場合、ループが実行されるのはなぜですか?ループは決して走らないのですか?

+0

アントン私は理解していません、どのポインタについて話していますか? –

+0

ハンターマクミレンそれはどういう意味ですか? かそのようなものを含める必要がありますか? –

+2

'' false "'は文字列リテラルです。このリテラルにアクセスする唯一の方法は、リテラルへのポインタです。リテラルが存在するため、while( "false") 'はwhile(0)'の間は評価できません。 – George

答えて

3

"false"は、ゼロ以外のアドレスの文字列です。アドレスはwhileの条件ではtrueと評価されます。

4

ループは、while(1)while(100)while("something else")のように機能します。 私はこのコードの作者はユーモアの奇妙な感覚を持っていると思います。

1

whileループが実行されないようにするには、番号は0、またはキーワードfalseにアポストロフィや引用符などをつけずに指定する必要があります。

0またはfalseはブール型値です。ただし、 "0"が文字列値であるため、"0"を渡すことはちょうど0と同じではありません。 0またはfalseから離れたforループの条件内にあるものは、何らかの条件を指定していない限りwhile()が実行されますが、それはとは関係ありません。質問です)。 「0」0に等しいない文字列であるため

したがって、コンパイラは、非偽の値(またはゼロ以外の値)としてそれを見て通過し、while()ループを実行します。 を実行すると、whileループは1回も実行されません。を実行すると、whileループは1回も実行されません。

2

while制御構造はブールパラメータのみを受け入れます。

ブール型パラメータを取得しない場合、パラメータはブール値に評価されます。この場合、「false」は文字列であり、値はtrueと評価されます。 0falseのみが実際にはfalseを意味します。

+0

私は 'NULL'と' '\ 0''は偽を意味すると思います。 :-) –

+0

@ZhigangAn 'NULL'は0を表すトークンであり、NULLバイトの10進値は0であることが保証されています。 – George

+0

はい、私は@Georgeに同意します。NULLはちょうど0と0を表し、nullバイトはfalseと等しくなります。 –