ショボ短歌会

#include <stdio.h> #include <string.h>int main(void) { char str[] = "str == NULL ? \"(NULL)\": str"; char* p, * q; int ch; p = str; for (;;) { for (q = p; !(*q == '?' || *q == ':' || *q == 0); q++); ch = *q; *q = 0; printf("|%s|\n", p); if (ch == 0) break; p = q + 1; } } に関して、 !(*q == '?' || *q == ':' || *q == 0); より、?や;や0でない時に ch = *q; *q = 0; printf("|%s|\n", p); if (ch == 0) break; p = q + 1; が働くと思うのですが、デバッグでchを見ると ?や;や0が入っていました。 なぜ否定した物が入ってきているのでしょうか?

また、#include <stdio.h> #include <string.h>int main(void) { char str[] = "str == NULL ? \"(NULL)\": str"; char* p, * q; int ch; p = str; for (;;) { for (q = p; !(*q == '?' || *q == ':' || *q == 0); q++); ch = *q; *q = 0; printf("|%s|\n", p); if (ch == 0) break; p = q + 1; } } の!(*q == '?' || *q == ':' || *q == 0);を (*q == '?' || *q == ':' || *q == 0);とした場合の処理はどうなるのでしょうか?

A 回答 (1件)

> なぜ否定した物が入ってきているのでしょうか?



ここ、

https://oshiete.goo.ne.jp/qa/12502872.html

で書いた通り、全く関係ないモノを結びつけて考えてるんで、ドツボにハマってるだけ。
否定してるのは脱出条件であり、これはC言語のforの文法の要求により「そう書かざるを得ないから」であって、ぶっちゃけ、ド・モルガンの法則もクソも関係がない(ド・モルガンの法則を使っても否定は「取れない」)。
明らかに勘違いである。

> (*q == '?' || *q == ':' || *q == 0);とした場合の処理はどうなるのでしょうか?

んなもんはここで聞くまでもない。
自分で実験してみたらいい。
おそらく無限ループに陥るだろう。
    • good
    • 1
この回答へのお礼

ありがとうございます。

お礼日時:2021/08/08 20:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!