アカウント名:
パスワード:
同じ結果になるように実装しているのだから、どう違うのかといえば違いませんな。
コードについて言えば...int x を (static な生存期間をもつ現在位置ではなくて) auto な生存期間のものにするともうちょっと違う鴨。C (なのかな、exit がそう書けるかどうか...?)だと main の引数は変更できないから(※1)別の関数名にする必要があり、さらに脱出に exit 以外のものを使用する必要がありますが。
コンパイラがそう最適化するはず/べきだ、という話であれば、極端に話「学生に数字を列挙せよ」というところからプログラミングといってるのと同じで話してるレベルがちょいと違う。(学生が理解できないのは学生がタコなだけ、ですし)
※1 あーフリースタンディング環境がどうとかいう話は別でお願いね ^_-☆
その例だったら前者の方がマシだと思います。まぁ、コンパイル通らないけど。
だれもC言語とは言っていない
じゃあ、何言語か教えてください :)
//それはなんの例示なの?//ふつうこうじゃない?
#include
int main() { int x = 0; while(++x = 100) printf("%d\n", x); return 0;}
ちょー上からコメントしたくせに投稿したら比較演算子が消えちまった。これははずかしい…
さすがコラッタ
コラッタへの熱い風評被害
gotoで作るループを再帰ととらえる人がいるのはちょっとした驚きです。
逆、gotoによる繰り返しをループと呼んでいるんだよ。まぁ再帰の方も引数無しの広域変数で再起抜けてたり、exit(一般的には関数からのリターンではなくプログラムの終了)だと呼び出し元もクソもねぇだろとか色々しっくりこないわけですが。
/* どうちがうのか、自分には全くわからない。gotoは0引数の自分への再帰でしょう? *//* 末尾最適化できないのはコンパイラかプログラマがタコなだけ。 */
確かに。
$ cat doloop.c#include <stdio.h>int x=0;int main(){ do { x++; printf("%d\n",x); } while(x<100);}
$ cat goto.c#include <stdio.h>int x=0;int main(){main: x++; printf("%d\n",x); if(x<100){ goto main; }}
$ cat recursive.c#include <stdio.h>int x=0;int main(){
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家
再帰とループの違いが全くわからん (スコア:2)
/* どうちがうのか、自分には全くわからない。gotoは0引数の自分への再帰でしょう? */
/* 末尾最適化できないのはコンパイラかプログラマがタコなだけ。 */
#include <stdio.h>
int x=0;
int main(){
main:
x++;
printf("%d\n",x);
if(x<100){
goto main;
}else{
exit 0;
}
}
#include <stdio.h>
int x=0;
int main(){
x++;
printf("%d\n",x);
if(x<100){
main();
}else{
exit 0;
}
}
新人。プログラマレベルをポケモンで言うと、コラッタぐらい
Re: (スコア:0)
同じ結果になるように実装しているのだから、どう違うのかといえば違いませんな。
コードについて言えば...
int x を (static な生存期間をもつ現在位置ではなくて) auto な生存期間のものにするともうちょっと違う鴨。
C (なのかな、exit がそう書けるかどうか...?)だと main の引数は変更できないから(※1)別の関数名にする必要があり、
さらに脱出に exit 以外のものを使用する必要がありますが。
コンパイラがそう最適化するはず/べきだ、という話であれば、
極端に話「学生に数字を列挙せよ」というところからプログラミングといってるのと同じで話してるレベルがちょいと違う。
(学生が理解できないのは学生がタコなだけ、ですし)
※1 あーフリースタンディング環境がどうとかいう話は別でお願いね ^_-☆
Re: (スコア:0)
その例だったら前者の方がマシだと思います。
まぁ、コンパイル通らないけど。
Re: (スコア:0)
だれもC言語とは言っていない
Re: (スコア:0)
じゃあ、何言語か教えてください :)
Re: (スコア:0)
//それはなんの例示なの?
//ふつうこうじゃない?
#include
int main() {
int x = 0;
while(++x = 100)
printf("%d\n", x);
return 0;
}
Re: (スコア:0)
ちょー上からコメントしたくせに投稿したら比較演算子が消えちまった。
これははずかしい…
Re: (スコア:0)
さすがコラッタ
Re: (スコア:0)
コラッタへの熱い風評被害
Re: (スコア:0)
gotoで作るループを再帰ととらえる人がいるのはちょっとした驚きです。
Re: (スコア:0)
逆、gotoによる繰り返しをループと呼んでいるんだよ。
まぁ再帰の方も引数無しの広域変数で再起抜けてたり、exit(一般的には関数からのリターンではなくプログラムの終了)だと呼び出し元もクソもねぇだろとか色々しっくりこないわけですが。
Re: (スコア:0)
/* どうちがうのか、自分には全くわからない。gotoは0引数の自分への再帰でしょう? */
/* 末尾最適化できないのはコンパイラかプログラマがタコなだけ。 */
確かに。
$ cat doloop.c
#include <stdio.h>
int x=0;
int main(){
do {
x++;
printf("%d\n",x);
} while(x<100);
}
$ cat goto.c
#include <stdio.h>
int x=0;
int main(){
main:
x++;
printf("%d\n",x);
if(x<100){
goto main;
}
}
$ cat recursive.c
#include <stdio.h>
int x=0;
int main(){