2016-11-05 5 views
1

C++でforループを作成したいとしますが、決定された条件に加えて、いつ、またはループを止めるべきかも知っています。そのような条件は、必ずしもハードコーディングされる必要はなく、ループがそのような決定値を常に有するべきであることに留意されたい。これはほんの一例で、おそらくランダムなループや、実行時に内容が決定されるものには便利です。この例を単純にしておき、プログラミングにおける関連するタスクに適用できるソリューションに焦点を当てましょう。C++ forループを停止する「最良の」方法は何ですか?

この2つのソリューションを比較したいと思います。最初のものはbreak文を使用し、2番目のものは複数または結合条件を使用します。どれが効率性や信頼性の面でタスクを達成するための「最良の」または「正しい」方法であるか。どちらがバグに弱いのですか?別の解決策を提案してください。

const int MAX_SIZE = 10; 
int myArray[MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

// two ways to stop a loop 

for (int x = 0; x < MAX_SIZE; x++) { 
    if (myArray[x] == 7) { 
     break; 
    } 
    cout << myArray[x] << “ “; // fixed 
} 

for (int x = 0; (x < MAX_SIZE) && (myArray[x] != 7); x++) { 
    cout << myArray[x] << “ “; 
} 
+1

条件を1つの場所に保持し、実際のループコードが無関係な部分をクリアするので、2番目のフォームを選択します。私はこれが好みになると思う。 – user2296177

+2

ループの動作が異なるようです。 xは0、myArray [0]は7に等しいとします。 – PaulMcKenzie

+0

どちらの場合も毎回同じ数の比較をしています。私は、最初のものは読みやすいと思うが、誰もが標準の 'for'ループコードを光沢させ、第2の条件を特別なものとして見ることができるからだ。正直なところ、それはほんのちょっとしたことだと思う。 –

答えて

3

まず、ループは見た目異なる動作を - 他のいない間最初のものは、まだ数7を出力します。

行をスワップすると、コンパイラにとって大きな違いはありません。両方のソリューションがほぼ同じネイティブコードでコンパイルされます。

可読性について(およびエラーが発生しやすい):このような単純なルールでは、条件の一部とする方がより優れていると思われます。しかし、もっと複雑になると、一時変数を導入する価値があるかもしれませんし、breakの亜種は読みやすくなります。ループ内でbreakを使用するより複雑なアルゴリズムでは、実際にはかなり一般的です。breakのループが無限ループであることさえあります。

1

2つのループは同等ではありません。最初のループは(少なくとも、あなたが指定した配列の内容のために)あなたが実際に

for (int x = 0; x < MAX_SIZE; x++) 
{ 
    if (myArray[x] == 7) 
    { 
     break; 
    } 
    cout << myArray[x] << " "; 
} 

にそれを変更する必要があると思い秒と同じ出力を生成するようにするには、ほとんどの人があなたの第二を見つけますループを終了できる2つの別々の場所ではなく、ループを終了する明確な条件が1つあるため、より読みやすい形式になります。それが私が普段使うものです。

あなたが持っていたフォームが同等だったと思うという事実は、可読性の心配があなたに影響していたことを示しています。したがって、第2の形式は間違いなく好ましいものです。

+0

ありがとうございます。そのループの形は、私が本当に意味していたものです。 – Galaxy

2

他の人も指摘しているように、2つの方法は等価ではないため、他の方法よりも多くの出力が生成されるためです。しかし、それはちょうどタイプミスだと思うし、あなたはコードを実行することによってそれを明確に特定することができました。

比較のために、ループを停止する前に、より多くの停止条件を使用する必要がある場合(一般的な場合よりも読みやすく、ifが非常に長い場合)一般化が容易です。たとえば、最初にmyArray[x] == 7をチェックしてからループを解除する前に何かを出力したいと思うかもしれません。したがって、コードが複雑な場合は、最初の方法が優れています。

パフォーマンス面では、これらのメソッドは非常に似ています。

関連する問題