痔になりやすい生活習慣とは?

はじめまして。大学でC++を習い始めたばかりの初心者です。
最近while文とwhile文と使った無限ループを知ったのですが、
両者の違いがイマイチわかりません。
私のイメージですと、while文は条件が真である限り何度でも判定し
条件が偽になればループを抜ける。
一方無限ループもif文を使った条件が真にならない限りbreakしない。

while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが…
ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

>while文と無限ループの違い


そもそも、両者の定義はまったく違います。
while文はC言語などでループ(繰り返し)処理を実現するための
予約語であって、無限ループとはアルゴリズム上(実装上)での
while文の書き方の一つでしかありません。

>while文の偽と判定する部分がif文で真と判定するだけで、同じような気がする
そのとおりです、上記で書いたように書き方の一つでしかありません。
この場合、繰り返し処理を終わる可能性があるものは無限ループとは
呼びません。

無限ループというのは単に実装上で繰り返し処理の
終わり(繰り返し処理を抜ける機会)が無いループの事を
言っているに過ぎません。

int flag = 0;
while( flag==0 ){
 flag++;
}

と書こうが

int flag = 0;
while(1){
 if( flag!=0){
  break;
 }
 flag++;
}
と書こうが両者は無限ループではありません。
(厳密には多少違いますが、処理的な差異はありません)

無限ループとは以下の場合があります。
(例外やフックなどはここでは考慮しないものとします)
//flagが繰り返し処理中に変化しない場合
int flag = 0;
while( flag==0 ){
}

//変化しても抜ける機会が無い場合
int flag = 0;
while(1){
 if( flag!=0){
 }
 flag++;
}

//一番分かりやすい無限ループ
while(1){
}

などです。
ちなみにfor文では
for(;;){
}
などと書いたりします。
    • good
    • 0

(1)


  a = 0;
  while ( a == 0 ) {
  }

(2)
  a = 0;
  b = 0;
  c = 0;
  while ( 1 ) {
    if ( a != 0 ) break;

    if ( b == 1 ) break;

    if ( (c != 0) && ( c == b ) break;
  }

処理を抜ける条件が複数あって、1つの条件式にする事が
できない。又は、ループの途中で処理を終了させたい様な
時に、(2)の様な使い方をします。

また
(3)
void aa() {
  if ( a != 0 ) return;

  if ( b == 1 ) return;

  if ( (c != 0) && ( c == b ) return;
}

の様に複数箇所でモジュールから抜ける処理が有ると
デバッグ時に、ブレークポイントを複数設定しないと
いけませんし、設定に洩れがあると終了時の変数の値
を確認できないまま処理から抜けてしまうので(4)の
様にする場合が有ります。

(4)
void aa() {
  do {
    if ( a != 0 ) break;

    if ( b == 1 ) break;

    if ( (c != 0) && ( c == b ) break;

  } while (0);
}
この様にするとデバッグ時にも最後の行に1箇所
ブレークポイントを入れておけば、モジュール終了
時の変数値の確認ができますし、大規模システムの
場合に行われるログ出力処理も1箇所で済ませる事
ができます。
    • good
    • 0

基本的には同じですが、使い方が違います。


簡単に書きます。

通常のwhile文の場合。

int i = 0;

while (i < 10) {
処理A;

  処理B;

  処理C;

  i++;
}

この場合は、処理A、処理B、処理Cをそれぞれ10回処理を行ったら、処理が終了します。

一方、無限ループと言われているやり方^^。
(実際は無限ループとは言いません。)
以下のようにコーディングします。

int i = 0;

while (1) {

  処理A;

  処理B;

  if (i < 10){
   処理C;
   break;
  }

  i++;
}

処理A、処理Bをそれぞれ10回処理して、処理Cのみ9回しか処理を行わない場合に、このように記述します。

どうですか?
処理結果が違ってきますよね。

プログラミングをする場合は、言語だけではなく、どのような処理をプログラミングするのかを考えれば、理解できると思います。

このような、回答が欲しかったのでしょうか?
因みに、無限ループは、永遠に処理が終わらない事です。

頑張って勉強してくださいね^^。
    • good
    • 0

while (true) {


 if ( !expression ) break;
 do_something();
}



while (expression) {
 do_something();
}

が同じではないか?ということで良いですか?

コンパイラから見れば同じかもしれませんが、プログラマから見ればコードの見やすさ、保守性などが違います。

# ANo.3 の人とダブッた。
    • good
    • 0

基本的には、while( 真 ){}としているだけですから、同じものです。



違いといえば、使い方の差ですかね。

条件によって、途中で処理を中断させたい場合とか、条件によって異なる処理をさせた後でループを抜けたいとか。
もちろんwhileの中に基本的な条件をいれておいて、例外的にifで対応ということもできますが、ループを抜ける条件があちこちにかかれると、可読性が悪くなりますし。

どうすれば正しいというのはなくて、可読性やメンテナンスのしやすさといったいろいろな条件を加味して、どちらを使用するか決めることになります。
    • good
    • 0

(1)


while ( 条件文 ) {
}

(2)
while ( 1 ) {
 if ( 条件文 ) break;
}
との違いでしょうか。
ならば#1の方の言うとおり、条件を判断する箇所が違うだけで全く同じです。要するにプログラマの好きなように書けばいいのです。
(1)の書き方は一定の条件の場合、(2)の書き方は繰り返すごとに条件が変わる場合とかに経験上、分けられます(←あくまでも個人的な私見)。
    • good
    • 0

質問の意味を完全にはよく把握していないので推察して回答します。

見当違いでしたらすみません。

if文で抜ける場合には、抜ける判定がされたときに、if文の後からloopの終わりまでのプログラムが実行されずに抜けてしまうところが実用的に異なると思います。もしそのif文をloopの最初か最後に置いたら、whileを使ったloopと同じになると思います。

あと「無限ループ」という言葉ですが、判定するif文が入って無限には続かないものは、「無限ループ」とは言わないような気がします。私は実際にプログラムを強制終了でもさせない限り回り続けるループのことを「無限ループ」と呼ぶと思っていました。ただ世の中にはそう呼んでいる世界もあるかもしれないので、確実なことは知りません。
    • good
    • 0

はい、全く同じです。

    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qfor文while文の無限ループの違いについて

for文の無限ループ for(; ;) と、
while文の無限ループ while(1) は、
どのように違うのですか?

処理速度やCPU負荷を考慮して、
どちらを使用するか悩んでいます。

よろしくお願いします。

Aベストアンサー

最適化されれば、どちらも一緒と思います。
心配?ならアセンブラのソースを出力させて確認するのが一番かと。(もしくは、デバッグでコードを確認)
ちなみに、Borland Free Compilerでは、どちらのループ命令もジャンプ命令が1個生成されるだけです。

こんな感じのコードになりました
loop_top:
ループ内処理のコード
jmp loop_top

Qbreak文でループを一気に抜けるには

break文でループを一気に(2個以上)
抜けたい場合はどのようにすればいいのでしょうか?
たとえば下のプログラムで1から2に抜けたい
すなわちifとforの2つの中括弧を同時に抜けたい場合には
どうやってbreak文を記述すればいいのでしょうか?
(goto文は使わないということでお願いします。

int k=0;
int i;

for (i=1;i<10;i++){
  k++;
  printf("%d",k);
  if (k == 5){
    printf("a");
    break;・・・・・・・・・1→
  }
}
printf("finish");・・・・・・・・・2←

Aベストアンサー

No.2 です。

> for文を2つ一気に抜ける場合にはどうしたらいいんでしょうか?

この場合は、素直に goto 文を使うか、No.1 さんのようにフラグで制御するしかないでしょう。

私はC言語実務経験20年以上ですが、goto 文について言えば、「無闇やたらに使うべきではないが、使うべき所で使うのをためらってはいけない」ということです。
よく、「何が何でも絶対に goto は使うな!」と言う人がいますが、これは間違っています。
たった1個の goto 文を避けるために、フラグなどを組み合わせて複雑怪奇な構造にすることの害の方が、余程大きいです。

Q#if 1 #elseの意味について

#if 1
 文 
#else 
 文
#endif
という表記に関して、「#if 1」が「必ず有効」という事はわかるのですが、ここでの「#else」とは「1」でない時ということで、「#if 0」と同じ意味と考えていいのでしょうか?

Aベストアンサー

>「#if 0」と同じ意味
「#if~#endif」がすこーぷの範囲ですから、似ていますが、正確には違います。

「#if 1」であれば、「#if 1~#else」の間の処理が有効、「#else~#endif」が無効、
「#if 0」であれば、「#else~#endif」の間の処理が有効、「#if 0~#else」が無効
と排他になります。

QC言語 While文(ループ)内の文字入力

While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。

【プログラム部分】
#include<stdio.h>

int main(void)
{
   char a;

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);

   if(a == 'x')
     break;

   printf("入力したのは %c です。\n",a);
   }

   return 0;
}

【実行結果(キーボードからは「 e 」と入力」)】
1文字を入力:e
入力したのは e です。
1文字を入力:入力したのは
です。
1文字を入力:

【私が意図している結果】
1文字を入力:e
入力したのは e です。
1文字を入力:


 ちなみにC言語の環境は、インターネットで無料で入手できる試食版です。(LSI C-86 Ver3.30c 試食版)
 上記プログラムを見てもらえればお分かりだと思いますが、「xを入力するまで、永遠と1文字入力とその表示を行う」ことを意図しています。しかし実際の結果は意図に反しています。
 1回目は正常に動作しているようですが、問題は2回目以降。scnafで入力待ちをすることなく、なぜかscanfをスルーする形で3回目のscanf入力待ちとなっています。この理由を教えてください。お願いします。

While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。

【プログラム部分】
#include<stdio.h>

int main(void)
{
   char a;

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);

   if(a == ...続きを読む

Aベストアンサー

>1文字を入力:入力したのは
>です。

は、[Enter]キーの入力によるためです。
[Enter]キーをスルーする必要があります。

   char a;
char dummy; /*[Enter]キー用*/

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);
scanf("%c",&dummy); /*[Enter]キー用*/

   if(a == 'x')
     break;

   printf("入力したのは %c です。\n",a);
   }


で、どうでしょうか?

Q無限ループを抜け出す方法を教えて下さい。

ご覧いただきありがとうございます。
タイトルの通り、無限ループを抜け出す方法を教えて頂きたいです。

for( ; ; i++) {
printf( "%ld", i );
}

たとえば、上記の無限ループをキー入力待ちをすること無しに、キー入力があった場合に途中で抜ける方法はあるのでしょうか?
ご回答のほどよろしくお願いいたします!!

Aベストアンサー

★キー入力されたかの判定は『kbhit』関数が便利です。
・MS-DOS、Windows 系の OS ならば『kbhit』でキー入力の有無をチェックできます。
・下に簡単なサンプルを載せます。

サンプル:
#include <stdio.h>
#include <conio.h> ←kbhit()のため

long i;

for( i = 0 ; !kbhit() ; i++ ){
 printf( "%ld\n", i );
}
getch(); ←※

解説:
・for 文の kbhit() 関数がキー入力されたら 0 以外を返し、キー入力がなければ 0 を
 返す関数です。これを利用すれば、キー入力があった場合に途中で抜ける事が可能です。
 kbhit()関数の参考リンクは。→http://www.geocities.co.jp/SiliconValley-Bay/7437/c/c7.htm
・また、for 文の最後にある getch() 関数は、キー入力があった後に入力された1文字を
 読み捨てています。これは、キー入力があって for 文を抜けた後にプログラムが終了する
 場合は、コマンドラインなどにキー入力された1文字が入力されてしまうために付け加えています。
・ただし、kbhit() という関数は Windows 系しか使えないです。
 UNIX 系では kbhit() がないため、同様な機能を自前で作ります。
 下の『参考URL』をどうぞ。
・以上。

参考URL:http://www.ncad.co.jp/~komata/c-kouza24.htm

★キー入力されたかの判定は『kbhit』関数が便利です。
・MS-DOS、Windows 系の OS ならば『kbhit』でキー入力の有無をチェックできます。
・下に簡単なサンプルを載せます。

サンプル:
#include <stdio.h>
#include <conio.h> ←kbhit()のため

long i;

for( i = 0 ; !kbhit() ; i++ ){
 printf( "%ld\n", i );
}
getch(); ←※

解説:
・for 文の kbhit() 関数がキー入力されたら 0 以外を返し、キー入力がなければ 0 を
 返す関数です。これを利用すれば、キー入力があった場合に途中で抜け...続きを読む

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}

Q引数 戻り値 return文について

今、C言語を初めて勉強してます。

勉強していて、引数と戻り値、return文

についてよくわかりません。

どなたか詳しく素人にもわかるように教えて

頂けないでしょうか?よろしくお願いします。

Aベストアンサー

まず、関数とは何らかの処理をして結果を返してくれるものです。わざとらしい例ですが二つの数を足してその結果を返す関数を見てみましょう。

#include <stdio.h>

int add( int hoge, int piyo ){
return hoge + piyo;
}

int main(void){
int data;

data = add( 253, 434 );
printf( "%d", data );

return 0;
}

見てわかると思いますが、引数とは関数内の処理に使うデータです。
このデータは関数を呼び出すときに与えます。

add( 253, 434 )

すると与えられたデータは関数に渡され仮引数と言うものに格納されます。
この例では hoge に 253、piyo に 434 が格納されます。

int add( int hoge, int piyo ){

この仮引数は普通の変数のように使うことが可能なのです。

hoge + piyo

そしてこの結果を戻り値として return 文で返してやります。

return hoge + piyo;

返すとは具体的にどこへ返すのかと言うと呼び出したところへです。
ここでは main 関数内の呼び出し元です。

data = add( 253, 434 );

data と言う変数へは関数によって返された戻り値(関数値とか返却値とかとも言ったりします)が格納されます。つまり 253 と 434 を足した数です。

引数も戻り値も結局はデータです。処理させたいデータが引数で、処理した結果であるデータが戻り値です。

return は呼び出し元へ結果を返すためのものです。


C言語の関数にはいろいろな種類があります。

引数も戻り値もあるもの。

int add( int hoge, int piyo ){
return hoge + piyo;
}

引数はあるが戻り値のないもの。

void add( int hoge, int piyo ){
printf( "%d", hoge + piyo );
}

戻り値はあるが引数のないもの。

#include <stdlib.h>
#include <time.h>

int getRandNum(void){
srand( time( NULL ) );
return rand() % 500;
}

戻り値も引数もないもの。

void print(void){
printf( "%d + %d = %d", 253, 434, 253 + 434 );
}

これらの使い分けはデータの内容や型、処理の内容により適宜必要なものを使ってください。

まず、関数とは何らかの処理をして結果を返してくれるものです。わざとらしい例ですが二つの数を足してその結果を返す関数を見てみましょう。

#include <stdio.h>

int add( int hoge, int piyo ){
return hoge + piyo;
}

int main(void){
int data;

data = add( 253, 434 );
printf( "%d", data );

return 0;
}

見てわかると思いますが、引数とは関数内の処理に使うデータです。
このデータは関数を呼び出すときに与えます。

add( 253, 434 )

すると与...続きを読む

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qプログラム設計書の書き方

僕は新人SEです。
今、上司の方からあるシステムの基本設計書・システム設計書・プログラム設計書を作り、プログラミングまでしてから単体テスト・結合テストもやるように言われています。(全て1人で)

おそらく経験のある方ならすぐにできてしまうようなシステムで、上司の方も勉強のために全てやらせているようです。

今、基本設計書・システム設計書まではなんとかできて、プログラム設計書の作成に取り掛かりたいのですが、初めての経験で実際のプログラム設計書には何をどのように書いているものなのかも全く見当もつかずにいるので全く何も書けません。

上司さんは今週忙しいようで
「来週見てあげるから自分で調べたりしてやってみて」
と言っています。
ですが、全く何もできずにいるのもイヤなので何かそれらしいものでも書いてみたいのですが…プログラム設計書とは何をどう書いてあるものなのでしょうか?

日本語が書いてあるのかプログラムが書いてあるものなのか…
そういったところからわからないので少しでも何か教えていただきたいです。
宜しくお願いします。

Aベストアンサー

こんにちは。
No.1様のご回答通りなのですが会社によって異なります。
というのを踏まえた上で・・・うちではという回答になりますが

・日付 2009/10/10
・版 初版(その後バージョンアップで改定するため、改定ナンバー必須)
・タイトル 企業情報印刷(ここでは決定済み名称)
・発注仕様書ナンバー(正式にお客さまと契約で決めた発注番号を記載)
・作成者 boo_boo_suu
・使用言語 Visual C++
・使用データベース ORACLE
・使用帳票アプリケーション Crystal Reports
・フロー図(Visioで埋め込み図)
・概要説明 
メインメニューから呼び出され企業情報の印刷条件を入力し、クリスタルレポートの帳票情報から企業情報ファイル(KIGYOU_INFO)ファイルを呼び出し印字します。
・全企業情報が一覧で印字可能である。
・特定一企業(企業コード指定)での印字も可能である。
・一企業が指定された場合は企業情報を画面表示する。

-----------------------------------
で・・・・プログラム仕様書はこのくらい。
命令書ですからコードそのものは打ちません。
これみて作ってもらわないといけないので日本語メインです。

あとはDBの仕様書をみてもらったりしてプログラムのローカルルール、画面サイズ、文字サイズ プロシージャ定義やら定数や変数、フォーム、構造体定義書などプログラム書くときの決まりごとに添ってPGさんに打ってもらっています。
一応、図とかつけてみました。(^-^;;
全体の雰囲気はこんな感じだとご理解いただければ幸いです。
ではでは~。

こんにちは。
No.1様のご回答通りなのですが会社によって異なります。
というのを踏まえた上で・・・うちではという回答になりますが

・日付 2009/10/10
・版 初版(その後バージョンアップで改定するため、改定ナンバー必須)
・タイトル 企業情報印刷(ここでは決定済み名称)
・発注仕様書ナンバー(正式にお客さまと契約で決めた発注番号を記載)
・作成者 boo_boo_suu
・使用言語 Visual C++
・使用データベース ORACLE
・使用帳票アプリケーション Crystal Reports
・フロー図(Visioで...続きを読む


人気Q&Aランキング