LoginSignup
2
0

More than 1 year has passed since last update.

do-whileとwhileを間違えるとどうなるか

Last updated at Posted at 2021-07-26

はじめに

Incrementsのnara_sakiです。Qiita広告の企画営業をしています。文系ビジネス職ですが「実際に自分でも手を動かしてみたい!」という思いから、プログラミングを勉強しています。

今は、ハーバード大学が無償提供している「CS50 for Japanese: コンピュータサイエンスの入門」を受講しています。

本記事は自分が学んだことの備忘録です。
Week1(C)の課題で、do-while/whileの違いを実際のコードで体感したので、備忘録として残しておきます。

do-while/whileの違い

do-while

  1. プログラムを実行する
  2. プログラム実行後、条件をチェックする

do-whileでは、条件をチェックする前にプログラム実行されるため、条件の合致に関わらず最低1回はプログラムが実行される。

while

  1. 条件をチェックする
  2. 条件に合致する場合、プログラムを実行する

whileでは最初に条件がチェックされるため、条件に合致する場合のみプログラムが実行される(合致しない場合はプログラムは実行されない)。

実例:do-while/whileの使い方を間違えるとどうなるか

CS50の課題でループ処理をする際、whileではなくdo-whileを使ったところ、期待する結果が得られませんでした。
実際の問題は載せられないため、簡略化した例を残しておきます。

例:実行したいプログラム

  1. ユーザーに手持ちの現金(yen)を入力させる(0円を入力された場合は、1円以上が入力されるまで繰り返す)
  2. 100円のりんご(apple)を最大何個買えるか計算し、最大個数を出力する

whileの場合

  • yen >= 100 の場合、appleの最大個数が出力される
  • yen < 100 の場合、りんごは1個も買えないのでappleの個数は0と出力される
#include <stdio.h>
#include <math.h>

int main(void)
{

// ユーザーに手持ちの現金を入力させる
    int yen;
    do
    {
        yen = get_int("yen: ");
    }
    while (yen < 1);

    int apple = 0;
    while (yen >= 100)
    {
        yen = yen - 100;
        apple++;
    }

// りんごの最大個数を出力する
    printf("%i\n", apple);
}

do-whileの場合

  • yen >= 100 の場合、appleの最大個数が出力される
  • yen < 100 の場合、お金が足りないのでりんごは1個も買えないはずだが、appleの個数が1として出力されてしまう(条件のチェックをする前に処理を行ってしまうため)
#include <stdio.h>
#include <math.h>

int main(void)
{

// ユーザーに手持ちの現金を入力させる
    int yen;
    do
    {
        yen = get_int("yen: ");
    }
    while (yen < 1);

    int apple = 0;
    do
    {
        yen = yen - 100;
        apple++;
    }
    while (yen >= 100);

// りんごの最大個数を出力する
    printf("%i\n", apple);
}

最後に

実際の問題はこちらです。

実際の開発現場では、do-whileはあまり使われずwhileを使うことが多いようですが、今回の課題を通して両者の違いがよくわかりました。

実際に手を動かしながら勉強すると、理解度も深まる気がします。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0