================
for(pp = path; *pp != '\0' && *pp == '.';){
if(!strncmp(pp, "../", 3)){
pp += 3;
while(bp > base && *--bp != '/');
}
================
http://xn--n9q36mh1hnxuksz7wt.jp/FE21a-pm/t09.html
この処理について教えてください。
if文の実行条件がどうしても分からないのです。
!strncmp(pp, "../", 3)はppの要素の先頭3文字と"../"の先頭3文字を比較して
一致しなかった場合にpp += 3;とwhile文を実行すると解釈しています。
つまり、ppの要素の先頭3文字が"../"だった場合は一致するのでif文は
実行されないと思うのですが、解説をみると逆になっています。
(ppの要素の先頭3文字が"../"だった場合は一致するのでif文は実行される。)
http://www.kmctec.net/k_gogo/gogo11/gogoans1144. …
if(!strncmp(pp, "../", 3))をどのように解釈すればいいのでしょうか?
No.1
- 回答日時:
直感に反するかもしれませんが、strcmp関数は二つの文字列が等しい場合に「0」を返します。
http://www9.plala.or.jp/sgwr-t/lib/strcmp.html
したがって、ppの要素の先頭3文字が"../"だった場合は一致するので if文は
if( ! 0 )となり、実行されます。
この回答への補足
回答ありがとうございます。
自分のトレースした自体は間違っていない事がわかりました。
strcmp関数で文字列が一致していれば、0を返すというのは分かるのですが、
if( ! 0 )というのがどういう状態なのでしょうか?
「比較対照の文字列は一致していなければ実行」
↓
「比較してみたら一致したので戻値の0(等しい)を応答」
↓
「!があるので、一致しているが否定される=『ゼロではない』となる」=「一致していない」
↓
実行
だとすると、if(!strncmp(pp, "../", 3))は、if(strncmp(pp, "../", 3)=0)と解釈しても良いのでしょうか?
そもそもの真偽判定の考え方が分かっていませんでした。
完全にハマってしまっている状態だったので、
とっかかりを頂けた気がします。ありがとうございました。
No.2ベストアンサー
- 回答日時:
(1)strncmpは比較した文字列が等しい場合は0を返します。
(2)ifは式の真偽を判定して真の時の処理を実行します。
ここで、C言語では偽の定義を整数の0、真の定義を0以外としています。したがって文字列が等しい場合はstrcmpの結果が0となり、偽と判定されますが、前に「!」が付いてるので真偽が反転して真になり、if分の{}内の処理が実行されるわけです。
本来ならこのif文は
if (strncmp(pp, "../", 3)==0) {
と書かれるべきですが、たまたま0が偽と定義されているので、比較式を書かずに関数の返り値を直接判定させるような使われ方がされることも多いのです。
ただし、これはC言語の真偽の定義が整数の0と0以外だからこそ使える裏技的な手法なので、C#のように真偽を表す論理型が整数型とは明確に別の型だと規定されている場合には使えません。
ありがとうございます!
「C言語では偽の定義を整数の0、真の定義を0以外」の部分を理解できていませんでした。
また、if (strncmp(pp, "../", 3)==0)だと偽になってしまい、if文が実行されないということも理解できました。
もの凄く良く理解できました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- DIY・エクステリア PP槽にFRP加工をしたいが、エポキシ塗料でできませんか? 3 2022/04/25 14:32
- 車検・修理・メンテナンス 20セルシオのバンパーの材質は樹脂ですか?PPですか?またもしそこにモールなど接着剤でつける場合、何 1 2023/03/07 10:07
- 相撲 この動画の最初に出てくる行司は誰ですか? https://m.youtube.com/watch?v 1 2022/06/10 21:00
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- ドラマ 興味ありますか? 1 2023/07/19 14:05
- その他(ホビー) TOMIXの踊り子の特急シンボルマーク(小)PP−200を探してるが あいにく売り切れのようだ。 ど 2 2023/06/04 19:02
- 軍事学 https://m.youtube.com/watch?v=J2go21HACr0&pp=ygUe5 3 2023/04/28 13:24
- CM 1996年のモータボートのCMです。You tubeであります。 https://m.youtube 1 2023/06/27 19:19
- リフォーム・リノベーション 押入れスペースについて 1 2022/10/09 21:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
応用情報技術者試験の令和元年...
-
インクリメント演算子のみを用...
-
右ビットシフト
-
Windows formアプリで データグ...
-
Linux Cプログラミングを学ぶた...
-
プログラミングについて。 1つ...
-
Stuck
-
Notepad++の関数リスト表示でC...
-
Linuxでの開発環境構築や設定の...
-
[C言語]fputsとfprintfの違い
-
Notepad++の関数リスト表示の変...
-
システムエンジニアの適正について
-
どちのほうがすきですか?
-
gccを行ってもexeファイルが生...
-
c言語
-
C言語 配列と関数の練習問題
-
こんなことてしますか??
-
C++6.0でのresource.hについて
-
c言語
-
MACで動く実行ファイルをWindow...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列と関数の練習問題
-
システムエンジニアの適正について
-
[C言語]fputsとfprintfの違い
-
C言語をコンパイルするとコンピ...
-
mallocについて
-
どちのほうがすきですか?
-
ArduinoのジャイロモジュールMP...
-
大量のデータを読み込んで表示...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C言語 列挙型(enum型)変数について
-
こんなことてしますか??
-
C言語の関数と配列に関する質問
-
Linuxでの開発環境構築や設定の...
-
質問失礼します。 プログラム言...
-
MACで動く実行ファイルをWindow...
-
WindowsのCapsLock(キャップス...
-
これなにがちがうんですか??
-
卒業研究でよく分からないとこ...
-
gcc13.2のバグ?
おすすめ情報