プロが教えるわが家の防犯対策術!

int n, bit, s;
s = 0;
while(n) {
bit = n % 2;
n /= 2;
if (bit == 1)
s++;
}

上の処理(2で割っていって余りが1になる回数を数える)において、nが45の場合をトレースしました。

すると、あるところで
n /= 2
の結果nが0になるのですが、そのとき、if以降の部分は評価されないのでしょうか。

要は、while文の中身が複文の場合に、条件式が偽になった場合に、偽になった箇所でループを抜けるのか、ループの最後の分まで評価されて次のループが開始される前にのみ条件式が評価されるのか、C言語の仕様はどうなっているのかという質問です。

よろしくお願いします。

A 回答 (4件)

> if以降の部分は評価されないのでしょうか。



されます。

> 条件式が偽になった場合に、
> 偽になった箇所でループを抜けるのか、
> ループの最後の文まで評価されて次のループが開始される前にのみ条件式が評価されるのか

後者です。

以下のようなサンプルを実行させてみれば直ぐにわかると思います。

int n = 1;
while(n){
printf("n = 1\n");
n = 0;
printf("n = 0\n");
}
    • good
    • 1
この回答へのお礼

ありがとうございます。お示しくださったサンプルで確認してみようと思います。

お礼日時:2019/07/10 12:21

発想が面白い。


こういう宣言された条件でブロック内の文の実行を逐一チェックし
実行を制御する言語は、私の知る限り無いですね。

エッフェルという言語に多少似た機能があったような。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2019/07/13 16:54

while(n)


の時点の n でのみチェックします... というか, ループの中身まで調べて「偽になった箇所でループを抜ける」だと
while (printf("%d\n", n), n)
という条件を組んだらどうすればいいんでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
while(printf("%d\n", n), n)
の部分が分かりませんでしたが、ループの最初でのみ評価する、ということですね、分かりました。

お礼日時:2019/07/10 12:23

while文の条件式部分はwhileでくくられた部分を実行するたびに評価されます。


ですからnが0ならwhile(0)ですからその時点で脱出条件が成立したと評価されwhileループ内は実行されません。

ただし、While文の()内は条件式でその評価結果を持ってループ内を実行するか抜けるかの判断がされますから、厳格には0、1ではなくtrue、falseです。
ということでwhile(n)ではなくwhile(n==0)と記すのが望ましく、それは他者がソースコードを見た際に「やっていることの意味」=「作者の考え」を誤解無く理解する上でも大切な事です。

---

ちなにみ。。。

> int n, bit, s;
> s = 0;
> while(n) {

変数sには初期値として0が代入されていますがnとbitの内容は不定です。普通0ですが保証はありません。
よって最初のwhile(n)が意図したとおりに動作する保証はありません。
で、想像しますに・・・

> while(n) {
> n /= 2;

・・・というところからしてnはローカル変数ではなく、この関数の引数なのではないでしょうか?
ただしその場合、この関数の機能は「2で割っていって余りが1になる回数を数える」ではなくなるかと思いますが。

参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございます。

ちなみに、nは、int…の変数宣言の後に、scanf()でキーボードから値を取得しています。今回はその部分を省略しました。

お礼日時:2019/07/10 12:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!