【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20218

「goto文は是か非か」の続き
投稿者---shu(2005/03/03 15:55:32)


goto文は是か非かの続きです。

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    FILE *fp1 = NULL, *fp2 = NULL;
    char *buf = NULL;
    int i;
    
    fp1 = fopen( "data1.txt", "r" );
    fp2 = fopen( "data2.txt", "w" );
    buf = (char *)malloc( 100 );
    
    if (fp1 && fp2 && buf)
        for (i = 0; i < 10 && fgets( buf, 100, fp1 ); i++)
            fputs( buf, fp2 );
    
    if (fp1) fclose( fp1 );
    if (fp2) fclose( fp2 );
    if (buf) free( buf );
    
    return 0;
}


なにごともif else という考えではなく、
ifの基本はif単体であるということ。
if条件にあてはまるときのみ処理を実行し、
条件に当てはまらないときは、elseは存在せず、
「次のステップ」に進むという考えに至りました。

1) 準備の為の処理
2) 準備が整った場合のみ、主となる処理の実行
3) 後片付けの為の処理

上記の流れにおいて、2)の処理で、
準備が整わなかった場合(else)まで考えてしまうと、
else処理と3)の処理が重複し、その回避方の為に、
スタイルさんはgotoを使うという選択をしたのだろう。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:「goto文は是か非か」の続き 20219 しっぽ 2005/03/04 00:54:00


No.20219

Re:「goto文は是か非か」の続き
投稿者---しっぽ(2005/03/04 00:54:00)


この例題では goto を使用しなくても、より見通しがよく綺麗なコードを作れることが、
元スレッドにて明らかにされていると私は考えています。よって、本例題にて goto 文
の是非を云々することに意味がないように思えます。




この投稿にコメントする

削除パスワード

No.20220

gotoからifへ(「goto文は是か非か」の続き)
投稿者---shu(2005/03/04 19:22:30)


>この例題では goto を使用しなくても、より見通しがよく綺麗なコードを作れることが、
>元スレッドにて明らかにされていると私は考えています。よって、本例題にて goto 文
>の是非を云々することに意味がないように思えます。
>

(元のスレッドで紛らわしかったreturnの使い方も考慮して)
gotoにならない「具体的」な方法は?
なぜgotoになってしまうのか?
など、自分の中ではっきりしてなかったことを、
自分なりにまとめたものを書きこみました。

前スレッドが長くなっていたので、新しくスレッドを立てました。
その際に、適切なタイトルをつけた方が、良かったかもしれません。

あとづけなりますが、タイトルを変更しました。


この投稿にコメントする

削除パスワード

No.20221

Re:gotoからifへ(「goto文は是か非か」の続き)
投稿者---しっぽ(2005/03/05 12:31:00)


抽象的な議論については応えられませんが、No.20218,shu(2005/03/03 15:55:32)
のスタイルより、以前の No.20176,shu(2005/02/28 15:18:54) の方が、私は好き
です。No.20218の新規コードのものでは、主処理部分のネストが深くなること、
最後まで資源確保の可否判断が必要になってしまうことです。

int foo( void )
{
    FILE *fp1, *fp2 = NULL;
    char *buf = NULL;
    int i;
    
    if(!(fp1 = fopen( "data1.txt", "r" )) || 
            !(fp2 = fopen( "data2.txt", "w" )) || 
            !(buf = (char *)malloc( 100 ))){
        if(fp1) fclose(fp1);
        if(fp2) fclose(fp2);
        return 1;
    }
    
    for (i = 0; i < 10 && fgets( buf, 100, fp1 ); i++)
        fputs( buf, fp2 );

    fclose(fp1);
    fclose(fp2);
    free( buf );
    
    return 0;
}





この投稿にコメントする

削除パスワード

No.20222

Re:gotoからifへ(「goto文は是か非か」の続き)
投稿者---しっぽ(2005/03/05 13:34:29)


追加。ある処理に失敗場合、その後の処理はしたくないです。

たとえば
fopen( "data1.txt", "r" );
に失敗した場合には、下記の処理は実行しない。
fopen( "data2.txt", "w" );
malloc( 100 );



この投稿にコメントする

削除パスワード

No.20226

Re:gotoからifへ(「goto文は是か非か」の続き)
投稿者---shu(2005/03/05 18:21:05)


>追加。ある処理に失敗場合、その後の処理はしたくないです。
>

ループ内で繰り返される関数なんか考えると、
些細なことだけど、余計なことはしたくないですね。
しっぽさん、いろいろと指摘ありがとうございます。

前回のスレッドと合わせて、
自分では気付けなかった、自分のソースの悪いところ、
自分では気付かなかった、自分のソースの良いところ、
をいろいろと発見することが出来ました。

すでにgotoからifへと付け直したタイトルからすら、
筋違いの方向にきてしまいましたので、
ひとまず、ここらでreturnしたいと思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧