はじめての C

C programming note*1
基本に戻って、ちょっと 復習。
プログラム upper3r には、次のような while文が 含まれています。

while (argc--) {
if )((fp = fopen(*argv, "r"))( == NULL)
cant(*argv);
do_one(fp);
fclose(fp);
argv++;
}
この while文から 抜け出るのは どの時点だろうか ?
それは、while の後の ( ) の中の 値が 0 に なったときです。

C においては if文や while文の 条件式での 真は 0 以外の数値、偽は 0 ということを 考えれば わかるだろう。(p343)

main() 関数の 仮引数 argc と argv は それぞれ、

argc -> 関数の引数 (パラメータ) の数 + 1

argv -> それぞれの 引数への ポインタ配列

ですから、たとえば 次のように パラメータを 指定すると、

$./upper3r upper3r.c
このとき argc は 2 という整数値、argv[0], argv[1] が コマンド upper3r と コマンドラインの upper3r.c とを 指すことになります。*2
argc-- は "argc = argc - 1" と 同じですから、while文の 後の ( ) の中身は、このルーティンを 1回 実行するごとに 1つ 減ることになります。
そして "argc == 0" と なった時点で、while文を 抜け出ます。
argv のほうは 逆に 次のパラメータへ 移動させないと いけないので、argv[0] → argv[1] と 配列の添字 subscript を 1つずつ 増やしていきます。
そのために 実行文の最後に、
argv++;
が 加えられて いるわけです。
また、islower() を 使っているところでは、if文の ( ) の中の 式の値が 0 に なると、同じように この if文は 終了しています。
if (islower(c)) {
if (c_flag == YES)
fputc(toupper(c), stdout);
else
fputc(c, stdout);
}
ライブラリ関数 islower() は c が 大文字だと 0 を 返すので、当然 if文の 後の ( ) の値は 0 となり、次に続く 文は 実行されず、結果的に この if文が スキップされることになる、ということですね。

*1:「作ってわかる Cプログラミング」

*2:実際は 1つ ずれますが