ここから本文です

C++についてです。 現在、C++を学習しています。 恐らく初歩的な質問なので...

Seizeurenemeさん

2014/7/1020:34:20

C++についてです。

現在、C++を学習しています。

恐らく初歩的な質問なのですが、親身になっていただければ幸いです。

// Const01a.cpp
#include <stdio.h>

int strcnt(char* psz, int letter)
{
int num;
for(num = 0; *psz; psz++)
{
if(*psz = letter)
num++;
}
return num;
}

int main()
{
char szPath[] = "C:/Program Files/Robert/BH/BH.exe";

printf("ファイル %s は、%d 重のフォルダの中に入っています。",
szPath, strcnt(szPath, '/') - 1);

return 0;
}

これがプログラムなのですが、下半分はまだ、さっぱり分かりませんが、とりあえずとばします。

int strcnt(char* psz, int letter)
{
int num;
for(num = 0; *psz; psz++)
{
if(*psz = letter)
num++;

このfor文なのですが、今まで僕がみたfor文は
for(i=0;i<5;i++).....;が多かったのでとまどっています。

*pszが条件?のfor文になるんですかね?とにかく意味が分からないんです。

どなたか回答お待ちしております。

閲覧数:
53
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2014/7/1117:36:55

(1)形式のお話

文法の説明をさせていただきますよ。

for (①;②;③) ④

②の部分ですね。ここは式を書くところです。で、これまでは i<5 とかっていう、何か判断を行っているかのような式ばかりご覧になっていたということですけど、実際は何の式でも良いのです。そしてまた、i<5 だって、ただの式なのですよ。

const bool f = i < 5;

こうすると、どうなるか分かりますか?i が 5 より小さい時、f は true になります。それでもって i が 5 以上(5を含みますよ)の時、f は false になります。
と、こんなわけで for 文の②の部分に i < 5 って書いてあった場合ですら、for 文の当人(?)としてはただの式だって見ていた。もっと言うと、それが 0 なのかどうかだけを見てたんですね。

これはwhile 文でも同じ。if 文でも同じ。すべて、ただの式だったのです。判定っぽい式しか書けないなんてことはなかったのです。判定しているように見えた式は、実はただ、条件によって true か false になるというものだったのですよ。で、true は 1、false は 0 となる。実は、for 文、while 文、if 文では 0 かどうかだけを見てたって言う話です。

for(; *psz; )

この場合の意味ですが、ポインタ psz が指したところにある文字を読み出しますよね。で、それが 0 かどうかを判断してループ処理を続けるか否かを決定する。文字が 0 というのはまあ、'\0' という意味。Null 文字ということです。

(2)意味のお話

/*①*/for(; *psz; ) { }
/*②*/for(; *psz != '\0'; ) { }

ただ、キーボードを打つ量を減らしたいから①のように書くのでしょうか。

②の方が分かりやすい。①は難しい。意味分かんないわ。そういうの、やめて欲しいなぁ…とか。そういった考えの人も多いと思います。

でもね、大事な意味があるんですよ。

*psz の意味。それは、*psz が大丈夫ならば…、*psz がちゃんとした値(文字)ならば…、*psz が正常ならば…、とか、そういう肯定的な意味。

!*psz の意味。*psz が何かまずい値?それとも *psz が無効?あるいは *psz は使えないもの…等々。否定的な意味です。

なので、

void* const pvNew = malloc(256);
if (pvNew) {
/*メモリ割り付け成功*/
} else {
/*メモリ割り付け失敗*/
}

とか、

FILE* const fp = fopen(filename, "r");
if (fp) {
/*ファイルオープン成功*/
} else {
/*ファイルオープン失敗*/
}

こんなふうに応用できます。

肯定、否定にうまく意味が合えば != NULL というのは取っ払ってしまおうっていう流儀。そう考えたら理解も深まると思いますよ。

質問した人からのコメント

2014/7/11 20:24:25

カテゴリマスター




trekfareastさんの説明に重ねて、n2q37さんの説明で理解できました。また機会がありましたら、その時はまたよろしくお願いします!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

tre********さん

2014/7/1022:05:39

fannta77777さんへ

>for(num = 0; *psz; psz++)

このfor文の条件は、ポインタが指す文字が文字列終端コード(0)でない間実行するというものです。
ポインタをインクリメントしていくとそのうち文字列の終わりの'\0'に到達し、そこでループから抜けるというものです。

C/C++の条件判定は「0かそうでないか」なのでこのような事が可能です。

ちなみに、

if(*psz = letter)
num++;

この文なのですが、おそらく正しくは、

if(*psz == letter)
num++;

だと思われます。
m(__)m

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる