• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:================)

if文の実行条件について教えてください

このQ&Aのポイント
  • if文の実行条件について詳しく教えてください。ppと"../"の比較はどういう意味ですか?
  • 解釈について疑問があります。ppの先頭3文字が"../"だった場合にif文が実行されるのはなぜですか?
  • if文の実行条件if(!strncmp(pp, "../", 3))の意味を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

(1)strncmpは比較した文字列が等しい場合は0を返します。 (2)ifは式の真偽を判定して真の時の処理を実行します。 ここで、C言語では偽の定義を整数の0、真の定義を0以外としています。したがって文字列が等しい場合はstrcmpの結果が0となり、偽と判定されますが、前に「!」が付いてるので真偽が反転して真になり、if分の{}内の処理が実行されるわけです。 本来ならこのif文は if (strncmp(pp, "../", 3)==0) { と書かれるべきですが、たまたま0が偽と定義されているので、比較式を書かずに関数の返り値を直接判定させるような使われ方がされることも多いのです。 ただし、これはC言語の真偽の定義が整数の0と0以外だからこそ使える裏技的な手法なので、C#のように真偽を表す論理型が整数型とは明確に別の型だと規定されている場合には使えません。

hiroto-milk
質問者

お礼

ありがとうございます! 「C言語では偽の定義を整数の0、真の定義を0以外」の部分を理解できていませんでした。 また、if (strncmp(pp, "../", 3)==0)だと偽になってしまい、if文が実行されないということも理解できました。 もの凄く良く理解できました。

その他の回答 (2)

回答No.3

strncmp(pp, "../", 3) はppの先頭が"../"であったとき0となります。 それに!がついているので、一致したとき1となり、if文が実行されます。

hiroto-milk
質問者

お礼

そもそもの真偽判定での1と0の取り扱い方法を理解できていませんでした。 先頭3文字が一致でstrncmpから0が応答 ↓ それを!で否定するので0→1となる。 ↓ 結果、if(1)となり偽(0)→真(1)となる ↓ if文が真なので実行される。 ということですね。 ありがとうございました。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

直感に反するかもしれませんが、strcmp関数は二つの文字列が等しい場合に「0」を返します。 http://www9.plala.or.jp/sgwr-t/lib/strcmp.html したがって、ppの要素の先頭3文字が"../"だった場合は一致するので if文は if( ! 0 )となり、実行されます。

hiroto-milk
質問者

お礼

そもそもの真偽判定の考え方が分かっていませんでした。 完全にハマってしまっている状態だったので、 とっかかりを頂けた気がします。ありがとうございました。

hiroto-milk
質問者

補足

回答ありがとうございます。 自分のトレースした自体は間違っていない事がわかりました。 strcmp関数で文字列が一致していれば、0を返すというのは分かるのですが、 if( ! 0 )というのがどういう状態なのでしょうか? 「比較対照の文字列は一致していなければ実行」 ↓ 「比較してみたら一致したので戻値の0(等しい)を応答」 ↓ 「!があるので、一致しているが否定される=『ゼロではない』となる」=「一致していない」 ↓ 実行 だとすると、if(!strncmp(pp, "../", 3))は、if(strncmp(pp, "../", 3)=0)と解釈しても良いのでしょうか?

関連するQ&A