ながら、私は、字句解析器のコードを見ていたし、私はこれに出くわした:C(偽)ループ
while ("false")
{
c = fgetc(f);
switch (state)
...
私はそれが正しい結果を生成し、それとのコードの動作をテストしました。 false
の条件がある場合、ループが実行されるのはなぜですか?ループは決して走らないのですか?
ながら、私は、字句解析器のコードを見ていたし、私はこれに出くわした:C(偽)ループ
while ("false")
{
c = fgetc(f);
switch (state)
...
私はそれが正しい結果を生成し、それとのコードの動作をテストしました。 false
の条件がある場合、ループが実行されるのはなぜですか?ループは決して走らないのですか?
"false"
は、ゼロ以外のアドレスの文字列です。アドレスはwhile
の条件ではtrue
と評価されます。
ループは、while(1)
、while(100)
、while("something else")
のように機能します。 私はこのコードの作者はユーモアの奇妙な感覚を持っていると思います。
whileループが実行されないようにするには、番号は0
、またはキーワードfalse
にアポストロフィや引用符などをつけずに指定する必要があります。
0
またはfalse
はブール型値です。ただし、 "0"が文字列値であるため、"0"
を渡すことはちょうど0
と同じではありません。 0
またはfalse
から離れたforループの条件内にあるものは、何らかの条件を指定していない限りwhile()
が実行されますが、それはとは関係ありません。質問です)。 「0」0
に等しいない文字列であるため
したがって、コンパイラは、非偽の値(またはゼロ以外の値)としてそれを見て通過し、while()
ループを実行します。 を実行すると、while
ループは1回も実行されません。を実行すると、while
ループは1回も実行されません。
while
制御構造はブールパラメータのみを受け入れます。
ブール型パラメータを取得しない場合、パラメータはブール値に評価されます。この場合、「false」は文字列であり、値はtrue
と評価されます。 0
とfalse
のみが実際にはfalseを意味します。
私は 'NULL'と' '\ 0''は偽を意味すると思います。 :-) –
@ZhigangAn 'NULL'は0を表すトークンであり、NULLバイトの10進値は0であることが保証されています。 – George
はい、私は@Georgeに同意します。NULLはちょうど0と0を表し、nullバイトはfalseと等しくなります。 –
アントン私は理解していません、どのポインタについて話していますか? –
ハンターマクミレンそれはどういう意味ですか?かそのようなものを含める必要がありますか? –
'' false "'は文字列リテラルです。このリテラルにアクセスする唯一の方法は、リテラルへのポインタです。リテラルが存在するため、while( "false") 'はwhile(0)'の間は評価できません。 – George