weemiee
@weemiee (weemiee)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【C言語】while()のカッコ内の ”文字”

Q&A

Closed

次のサイトにて紹介されているプログラムで、delnum()関数の一番外側のwhile()文について質問です。

while (s[i]) {とは何なのでしょうか?

もちろん、while()のカッコ内に条件式が入るというのは知っています。しかし、いくら条件式とはいっても「s[i]」と書かれているだけでは、どう解釈すれば良いのか分かりません。「左辺 演算子 右辺」の形でないため、そもそも「式」であるように思えないからです。
何が真で、何が偽なのでしょうか?

0

4Answer

C++では(一部の他の言語でも)、0以外の数字はTrueになります。
 上の記事のプログラムを見ると文字列をWhile文で回しているため、s[i]が0になる つまり文字列を最後までまわすために、このような評価式を()内に書いたのではないかと思います。

2Like

whileのカッコの中には式(expression)が入りますが、式とはもっと幅広いイメージです。
例えば数値や文字などの定数式とか関数呼び出しも含みます。

while (10) {
}
while (hoge()) {
}

expression が true (0 以外) の場合はステートメントの本体が実行され、手順 1 からプロセスが繰り返されます。

1Like

補足までに,char[] sのどのタイミングで0が出現するのかを書いておきます.ご存じでしたらすいません.

まず,

char str[] = "abcdef";

で与えられた文字列str[]の末尾には必ずNull Character,すなわち空文字が入ります.エスケープシーケンスを使用して\0と表される文字です.これは,ASCIIコード表を参照すると,整数の0に割り当てられていることがわかります.

なので,配列str[]の実態は

index 0 1 2 3 4 5 6
Symbol a b c d e f \0
DEC 97 98 99 100 101 102 0
HEX 61 62 63 64 65 66 0

のようにして格納されています.次のコードで確認できます.

#include <stdio.h>

int main(void){
    char str[] = "abcdef";
    for (int i = 0; i < 7; ++i) {
        printf("%d: symbol: %c, dec: %d, hex: %x\n", i, str[i], str[i], str[i]);
    }
    return 0;
}

ここで,while内の条件式のところに偽値として0が来たときループを終了,すなわちNull Characterの入っている文末が来たときに処理を終わることができるのです.文末までループしたいがためにこのような制御文になっています.したがって,冗長ではありますが

while(s[i] != '\0')

と書くことで「文末になるまで」という処理を明確に記述することも可能です.実際に,while(s[i])にネストされている一番深いwhile文ではこの文になっていますね.謎に2パターンの記述をされていることがわかります.

また参照されている記事にケチつけておくと,in-placeでかつ数字を見つけるたびに文字を詰める実装をしたため計算量を文字列$S$のサイズ$|S|$を用いて表すと$O(|S|^2)$になってしまっていることを補足しておきます.もうちょっと改善したin-placeな実装やout-of-placeな実装もしくは他の配列に情報を持たせるアルゴリズムでは$O(|S|)$まで計算量を削減できます.

1Like

@OyaTomoさん、@blue32aさん、@PondVillegeさん、ご回答ありがとうございます。
実を言うとwhile()文を習い始めた頃から抱えていた疑問だったので、解決出来て良かったです。
とても勉強になりました。

0Like

Your answer might help someone💌