以下のソースを書いた時,①つ目の条件だと条件失敗でprintfされない(これは要望通り)のですが,
②つ目のとき,strcmp(word[1], "no")!=0が反映されずprintfされてしまいます.
これは何が誤っているのでしょうか.
ifの条件式が反映されません
-
blade
Re: ifの条件式が反映されません
普通の処理系では、word[2]がNULLになることは無いと考えられます。
しかし、word[2]がNULLになる処理系が無いと断言することは私にはできませんでした。
しかし、word[2]がNULLになる処理系が無いと断言することは私にはできませんでした。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ifの条件式が反映されません
みけCATさんが書いたのは
char word[300][60]={'\0'};
だとword[2]は確かにポインタ値が得られますが、
char *word[300];
と定義した場合と違いword[2]がNULLなる可能性はほぼ無いといって良いという話です。
ナル文字と混同しているのなら、長さ0の文字列と言うことで
word[2][0]!='\0'
と同じ事を書いたつもりなのかしれませんが、ここはstrlen()を使うべきでしょう。
char word[300][60]={'\0'};
だとword[2]は確かにポインタ値が得られますが、
char *word[300];
と定義した場合と違いword[2]がNULLなる可能性はほぼ無いといって良いという話です。
ナル文字と混同しているのなら、長さ0の文字列と言うことで
word[2][0]!='\0'
と同じ事を書いたつもりなのかしれませんが、ここはstrlen()を使うべきでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ifの条件式が反映されません
NULLと'\0'とを混同しているように見えるのはさておき…
コードの条件文は || でor条件のように見えるのに、
printf()の中身が「~でもないし~でもない」と、いかにもand条件のことを
書いているように見えるのは大丈夫なんでしょうか。
また、条件1、2について、printf()の中のwordの添字iの値はちゃんとセットできているでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: ifの条件式が反映されません
つまり、「strcmp(word[1], "no")!=0」は偽です。blade さんが書きました:①つ目の条件だと条件失敗でprintfされない(これは要望通り)
プログラミングに限らず論理の世界で A || B は A が偽ならば
A || B ⇔ B
となります。
ちなみにですが、A && B は A が偽ならば
A && B ⇔ 偽
となります。
したがって、
strcmp(word[1], "no")!=0||word[2]!=NULL
⇔偽||word[2]!=NULL
⇔word[2]!=NULL
となって、仰るとおりの結果となります。
何も誤っておりません!blade さんが書きました:これは何が誤っているのでしょうか.
Re: ifの条件式が反映されません
条件式の使い方というより、boxさんのおっしゃるとおり、条件2は、想定した条件でしょうか?
説明すると、
word[1] は "no" がはいってていいんですね
なので、条件1は真で、printfされない
これは想定どおりですね。
次、条件2は、word[1]=="no" と word[2] != NULL ですね
まず、条件1から導きだされた word[1]=="no" で片方は真
もう片方は、ここのコードにはないので、初期化されていないと想定して word[2] にはゴミがはいっています
なので、word[2] != NULL になって、こちらも真 これをA
仮に初期化されていてて、word[2] == NULL(\0) で偽 これをB
とすると
Aの場合
真 || 真で 真となり、条件式が実行されます
Bの場合
真 || 偽 で、こちらも真になり条件式が実行されます
条件2でprintfされない条件は
偽 || 偽 となる場合のみです。
偽 || 真 も真となり、条件式が実行されます。
・・・ですよね?(汗)
説明すると、
word[1] は "no" がはいってていいんですね
なので、条件1は真で、printfされない
これは想定どおりですね。
次、条件2は、word[1]=="no" と word[2] != NULL ですね
まず、条件1から導きだされた word[1]=="no" で片方は真
もう片方は、ここのコードにはないので、初期化されていないと想定して word[2] にはゴミがはいっています
なので、word[2] != NULL になって、こちらも真 これをA
仮に初期化されていてて、word[2] == NULL(\0) で偽 これをB
とすると
Aの場合
真 || 真で 真となり、条件式が実行されます
Bの場合
真 || 偽 で、こちらも真になり条件式が実行されます
条件2でprintfされない条件は
偽 || 偽 となる場合のみです。
偽 || 真 も真となり、条件式が実行されます。
・・・ですよね?(汗)