ページ 1 / 1
ifの条件式が反映されません
Posted: 2013年3月02日(土) 18:21
by blade
以下のソースを書いた時,①つ目の条件だと条件失敗でprintfされない(これは要望通り)のですが,
②つ目のとき,strcmp(word[1], "no")!=0が反映されずprintfされてしまいます.
これは何が誤っているのでしょうか.
コード:
char word[300][60]={'\0'};
strcpy(word[1], "no");
/*条件①*/
if(strcmp(word[1], "no")!=0)printf("noではありません:%s", word[i]);
/*条件②*/
if(strcmp(word[1], "no")!=0||word[2]!=NULL)printf("noでもないしwordない:%s", word[i]);
Re: ifの条件式が反映されません
Posted: 2013年3月02日(土) 18:26
by みけCAT
word[2]がNULLである可能性は非常に低いと思います。
コード:
#include <stdio.h>
int main(void) {
char word[300][60]={'\0'};
printf("%p\n",word[2]);
return 0;
}
Re: ifの条件式が反映されません
Posted: 2013年3月02日(土) 18:32
by blade
みけCAT さんが書きました:word[2]がNULLである可能性は非常に低いと思います。
コード:
#include <stdio.h>
int main(void) {
char word[300][60]={'\0'};
printf("%p\n",word[2]);
return 0;
}
可能性が非常に”低い”とはどういうことでしょうか.
絶対に違うわけではないのですか.
Re: ifの条件式が反映されません
Posted: 2013年3月02日(土) 18:45
by みけCAT
普通の処理系では、word[2]がNULLになることは無いと考えられます。
しかし、word[2]がNULLになる処理系が無いと断言することは私にはできませんでした。
Re: ifの条件式が反映されません
Posted: 2013年3月02日(土) 19:09
by softya(ソフト屋)
みけCATさんが書いたのは
char word[300][60]={'\0'};
だとword[2]は確かにポインタ値が得られますが、
char *word[300];
と定義した場合と違いword[2]がNULLなる可能性はほぼ無いといって良いという話です。
ナル文字と混同しているのなら、長さ0の文字列と言うことで
word[2][0]!='\0'
と同じ事を書いたつもりなのかしれませんが、ここはstrlen()を使うべきでしょう。
Re: ifの条件式が反映されません
Posted: 2013年3月02日(土) 20:57
by box
blade さんが書きました:
コード:
/*条件②*/
if(strcmp(word[1], "no")!=0||word[2]!=NULL)printf("noでもないしwordない:%s", word[i]);
NULLと'\0'とを混同しているように見えるのはさておき…
コードの条件文は || でor条件のように見えるのに、
printf()の中身が「~でもないし~でもない」と、いかにもand条件のことを
書いているように見えるのは大丈夫なんでしょうか。
また、条件1、2について、printf()の中のword
の添字iの値はちゃんとセットできているでしょうか。
Re: ifの条件式が反映されません
Posted: 2013年3月11日(月) 16:58
by beatle
blade さんが書きました:①つ目の条件だと条件失敗でprintfされない(これは要望通り)
つまり、「strcmp(word[1], "no")!=0」は偽です。
プログラミングに限らず論理の世界で 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の条件式が反映されません
Posted: 2013年3月11日(月) 18:02
by dic
条件式の使い方というより、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されない条件は
偽 || 偽 となる場合のみです。
偽 || 真 も真となり、条件式が実行されます。
・・・ですよね?(汗)