質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

2回答

1071閲覧

C入門:初めて見たwhile文がどういった働きをするか

gorigori

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2017/07/15 09:51

###前提・実現したいこと
hash関数の中でのwhile文の働きがどういうものなのかわかりません。制御文がこの形になっているところを
初めてみました。是非どういう働きをするのか教えてください

###発生している問題・エラーメッセージ

どういう働きなのかわからない。

###該当のソースコード

C

1#define M 257 2int hash(char *v){ 3 int x; 4 x = 0; 5 while(*v) 6 x = 256 * x + (*v++); 7 x = x % M; 8 if(x < 0) 9 x = (-x); 10 return(x); 11}

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

while(doLoop)はdoLoopが0ならループを終了し、それ以外ならループ継続ですね。
なので、while(v)はvが0ならループを終了し、それ以外ならループ継続です。

そして、vはchar型(文字)へのポインタですので、*vはchar型の文字となります。
つまり、*vが0ということはvが指す文字が'\0'ということです。
従って、hash関数にNULL終端の文字列が渡され、先頭からNULL文字('\0')まで処理したらループ終了ということです。

投稿2017/07/15 11:00

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/07/15 11:02

あ、私の解答間違えてますね... *と++の結合の優先度を見誤ってしまいました。
gorigori

2017/07/15 13:59

とてもわかりやすい説明ありがとうございます! しっかりと理解することができました。m(_ _)m
guest

0

Chironianさんの回答を見て、致命的な間違いに気付きました。
以下の回答は*c++(*c)++と見誤っています。お恥ずかしい...

残骸

質問者様がどこまで理解しているかわからないため、順を追ってお話します。

  • 前提1: char型は-256~255の整数値を格納する(範囲は処理系によります)

C

1for(char c = 0; c < 0; c++);

上記のコードは有限回で終了します。255+1が-256と見なされるからです。

  • 前提2: C言語では0がfalse,それ以外がtrueと判断される

C

1char c = なんとか; 2if(c) printf("true\n"); 3else printf("false\n");

上記のコードでは、cに0を代入したときにfalseが、それ以外のときにtrueが表示されます。

  • 前提3: while文の評価部はtrue/false

タイムリーな記事が今日の昼に上がっていました。while(条件式)である必要はありません。

C

1char c = -200; 2while(c++);

上記のコードは有限回で終了します。

  • 前提4: ポインタについて

理解があるのであれば説明不要ですが、よくわからないなら次のように読み替えてください。

C

1#define M 257 2int hash(char v){ 3 int x; 4 x = 0; 5 while(v) 6 x = 256 * x + (v++); 7 x = x % M; 8 if(x < 0) 9 x = (-x); 10 return(x); 11}

もちろん等価ではありません。しかし、関数内の動作は同じです。


コードのwhile部を見てみましょう。

C

1while(v) 2 x = 256 * x + (v++);

評価する対象はvですね。vは整数型なので、インクリメントし続けるといつか0になります。
ハッシュ関数なので終了条件に明確な意味はありませんが、有限回で終了するのは必須ですね。


転ばぬ先の杖
前提としていくつか挙げましたが、私の説明が規格と合致しない箇所があるかと思います。
看過できない場合は、遠慮なくご指摘ください。

投稿2017/07/15 10:53

編集2017/07/15 11:06
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gorigori

2017/07/15 14:00

細かいところまで教えてくださりありがとうございます! とても勉強になりました。m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問