帝王にifなどいらぬ!
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/01/19(木) 16:30:19オレはその時からifを捨てた!
いや、自虐プログラマの血が目覚めたのだ!
というわけで、便利なifをあえて捨てたプログラミングを語ろう。
0002デフォルトの名無しさん
2006/01/19(木) 16:34:530003デフォルトの名無しさん
2006/01/19(木) 16:34:590004デフォルトの名無しさん
2006/01/19(木) 16:51:01{
return 0;
}
0005デフォルトの名無しさん
2006/01/19(木) 17:03:44{
int a[] = {x, y};
return a[x < y];
}
0006デフォルトの名無しさん
2006/01/19(木) 17:29:44オレはヤダ
0007デフォルトの名無しさん
2006/01/19(木) 17:32:060008デフォルトの名無しさん
2006/01/19(木) 17:33:170009デフォルトの名無しさん
2006/01/19(木) 19:41:440010デフォルトの名無しさん
2006/01/19(木) 19:54:310011デフォルトの名無しさん
2006/01/19(木) 20:16:14ifを使う人=下郎
else ifを使う人=子供
0012デフォルトの名無しさん
2006/01/19(木) 21:51:57hoge();
break;
}
while (x != y) { // else
fuga();
break;
}
こんなん?
0013デフォルトの名無しさん
2006/01/20(金) 00:56:49Perlならunlessで決まり!
0014デフォルトの名無しさん
2006/01/20(金) 08:46:48http://pc8.2ch.net/test/read.cgi/tech/1036013915/l50
0015デフォルトの名無しさん
2006/01/20(金) 11:02:520016デフォルトの名無しさん
2006/01/20(金) 21:04:32ifなど要らぬってことは条件分岐禁止ってことだ。
バグの80%は条件分岐に起因するという。
条件分岐を廃したソリッド・プログラミングを目指すんだ!
0017デフォルトの名無しさん
2006/01/21(土) 00:53:51は
A&&B||C&&D||E
で代用できるしな。
0018デフォルトの名無しさん
2006/01/21(土) 01:34:08それってコンパイラの実装によりそうな気がするんだが、
途中で以降の処理を中断とかってできるん?
あと、BとCが副作用を起こさないメソッドでないといけない気もする。
0019デフォルトの名無しさん
2006/01/21(土) 03:09:04よりません。
0020デフォルトの名無しさん
2006/01/21(土) 03:55:27Bが偽と評価されるようなコードだと使えないよ。
0021デフォルトの名無しさん
2006/01/21(土) 08:31:000022デフォルトの名無しさん
2006/01/21(土) 11:56:15Bの最後で1を返せばいいだけだろ。
0023デフォルトの名無しさん
2006/01/21(土) 13:17:28>>21
つまり、
A && (B, 1) || C && (D, 1) || E;
それも手なんだが、関数ポインタ配列を使えば条件分岐(含む&&、||)一切無しのコーディングができるな。
0024デフォルトの名無しさん
2006/01/21(土) 14:08:44hoge[a==b]();
ってこと?
0025デフォルトの名無しさん
2006/01/21(土) 19:46:01A < B の時は1、 B > Aは0を返す関数f(A, B)って1行で書けます?
もちろんif等のbool値による分岐は無しで。
0026デフォルトの名無しさん
2006/01/21(土) 20:23:29{
return A < B;
}
function f(A, B) {
return return (A < B) | 0;
}
0027デフォルトの名無しさん
2006/01/21(土) 20:24:44function f(A, B) {
return (A < B) | 0;
}
0028デフォルトの名無しさん
2006/01/21(土) 22:18:43A < B → 1
B > A == A < B → 0 ???
>>27
何がしたい。 0とのorは何の意味もないぞ。
0029デフォルトの名無しさん
2006/01/21(土) 22:51:23//ヒント:
function f(A, B) {
return {"true":1, "false":0}[A < B];
}
0030デフォルトの名無しさん
2006/01/22(日) 03:35:15それはなんのヒント? つーか、>28に書かれていることが理解できている?
0031デフォルトの名無しさん
2006/01/22(日) 10:55:010032デフォルトの名無しさん
2006/01/22(日) 11:58:43boolからintにするためにor? どこの言語だそれ。
0033デフォルトの名無しさん
2006/01/22(日) 11:59:56もしかしたら、A < Bは1、A > Bは0と言いたかったのか?
#それでもA == Bはどうするって問題が残るが。
0034デフォルトの名無しさん
2006/01/22(日) 12:29:38正解
BooleanをNumberに変換する定石
003525
2006/01/22(日) 19:03:35A < B なら1、B >= Aなら0でした。
0036デフォルトの名無しさん
2006/01/22(日) 19:05:310037デフォルトの名無しさん
2006/01/22(日) 22:35:41どうみてもJavascriptです。
本当にありがとうございました。
0038デフォルトの名無しさん
2006/01/26(木) 00:43:31条件分岐せずに素数を計算するプログラム書いてみろ
0039デフォルトの名無しさん
2006/01/26(木) 18:16:51#include <stdio.h>
#include <stdlib.h>
int main(void){long i,j,n,*p;
scanf("%ld",&n);p=(long*)calloc(n+1,sizeof(long));
for(i=2;i<=n;i++)p[i]=i;for(i=2;i<(n/2+1);i++)
for(j=i*2;j<=n;j+=i)p[j]=0;for(j=0,i=2;i<=n;j+=p[i++]!=0)p[j]=p[i];
for(i=0;i<j;i++)printf("%ld\n",p[i]);free(p);return 0;}
0040デフォルトの名無しさん
2006/01/26(木) 23:37:080041デフォルトの名無しさん
2006/02/11(土) 20:15:31↓
http://game.coden.ntt.com/games/ikki.html
King of Wands
http://game.coden.ntt.com/kingofwands/
0042デフォルトの名無しさん
2006/02/11(土) 20:47:30while(false){
処理
if (エラー){
break;
}
処理
if (エラー){
break;
}
処理
}
終了処理
こんなの。
素直にgoto使えっての。
0043デフォルトの名無しさん
2006/02/11(土) 21:05:49switch (0) {
case 0:
...;
if (...) {
break;
}
case 1:
...;
if (...) {
break;
}
case 2:
...;
if (...) {
break;
}
default:
...;
}
...;
/*なんてのも普通にある*/
/*#デバッグのときはswitch(1)とか*/
0044デフォルトの名無しさん
2006/02/11(土) 23:17:59> ポインタをインクリメント
< ポインタをデクリメント
+ ポインタが示すメモリ位置のデータをインクリメント
+ ポインタが示すメモリ位置のデータをデクリメント
. ポインタが示すメモリ位置のデータを出力
, ポインタが示すメモリ位置のデータに入力
[ ポインタが示すメモリ位置のデータがヌルなら対応する]までジャンプ
] ポインタが示すメモリ位置のデータがヌルじゃないなら対応する[までジャンプ
0045デフォルトの名無しさん
2006/02/11(土) 23:32:41こちらへお越し下さい
http://pc8.2ch.net/test/read.cgi/tech/1036013915/l50
0046デフォルトの名無しさん
2006/02/12(日) 05:52:32&&と||があればifなんか無くても ?: で全て済むだろ。
と、ログ全く読まずにレス。
0047デフォルトの名無しさん
2006/02/12(日) 09:58:41inline max(int a, int b)
{
return ((a^b)&((a-b)>>31))^a;
}
0048デフォルトの名無しさん
2006/02/12(日) 10:01:20ループ判定で条件分岐してるじゃん
0049デフォルトの名無しさん
2006/02/12(日) 12:21:13for while if ? switch 無しで
0050デフォルトの名無しさん
2006/02/12(日) 16:10:27それを言うなら、&&や||のショートサーキット評価だって条件分岐だ
0051デフォルトの名無しさん
2006/02/19(日) 11:58:27これさえあればプログラムは全て表現可能になる。
条件は無条件を含むし、転送は相手先がプログラムカウンタを
含むから、条件(&無条件)分岐は必ず含まれることになる。
0052デフォルトの名無しさん
2006/02/21(火) 22:42:110053デフォルトの名無しさん
2006/02/22(水) 16:41:36・・・条件設定命令はいらんのか? >51
0054デフォルトの名無しさん
2006/02/23(木) 20:06:05条件は転送の結果でもあるし、フラグを表現する領域への転送としても表現できる。
0055デフォルトの名無しさん
2006/02/24(金) 11:50:16>>>53
> 条件は転送の結果でもあるし、フラグを表現する領域への転送としても表現できる。
後者は分かるが、前者は、そんな副作用を突然持ち出されても困る。
だったら、条件付転送だって、演算結果を転送する命令でしかないだろう。
ということは条件付転送なんていらぬのだ。演算結果を転送する命令があればよい。
0056デフォルトの名無しさん
2006/02/24(金) 16:28:08いらんといわれても困る。
それに条件判断するところは一番単純化すれば転送の結果が
ゼロか1かだろう。
転送の結果のゼロか1かをフラグとして使えないなら条件判断が
否定されることになる。
0057デフォルトの名無しさん
2006/02/24(金) 22:57:360058デフォルトの名無しさん
2006/02/25(土) 00:03:28たとえばデクリメントを条件付き転送で実現するにはどうするんだ?
これができればほかのすべての演算ができそうだが、方法を思いつかない。
lea r0,(r0-1) if always とか・・・って反則だ。
0059デフォルトの名無しさん
2006/02/25(土) 00:26:47load r0,1 if r0==2
...
とかすればいいのか。馬鹿だ俺。
0060デフォルトの名無しさん
2006/02/25(土) 10:15:040061デフォルトの名無しさん
2006/02/25(土) 13:20:26ネタスレでネタを展開してるのに意味を問うなよw
0062デフォルトの名無しさん
2006/03/13(月) 11:41:54媚びぬ退かぬ顧みぬなんて言ってる人が
語ろうなんて言っちゃだめ
0063デフォルトの名無しさん
2006/03/13(月) 12:46:56変数aとbが同じ値なら表示、違う値なら非表示
EditBox.Visible = (a = b)
0064デフォルトの名無しさん
2006/03/13(月) 13:04:010065デフォルトの名無しさん
2006/03/13(月) 14:41:000066デフォルトの名無しさん
2006/03/13(月) 18:10:030067デフォルトの名無しさん
2006/03/13(月) 22:41:41ことじゃねぇ?だから、分岐してるプログラムはifつかってるのと一緒。
0068デフォルトの名無しさん
2006/03/14(火) 02:25:40こんな後ろ向きな考えでどうするか!
0069デフォルトの名無しさん
2006/03/15(水) 10:59:150070デフォルトの名無しさん
2006/03/17(金) 20:12:08int cond_lt (int a, int b) {
return ((a - b) >> 31) & 1;
}
int cond_zero (int a) {
return (~(a ^ -a) >> 31) & 1;
}
int zero (const char* s1, const char* s2) {
return 0;
}
int one (const char* s1, const char* s2) {
return 1;
}
int minus_one (const char* s1, const char* s2) {
return -1;
}
int strcmp (const char* s1, const char* s2) {
int a = *s1 & 0xff;
int b = *s2 & 0xff;
int (*table[8]) (const char*, const char*) = {
strcmp, zero, minus_one, minus_one, one,
0, 0, 0 // この3パターンは有り得ない
};
return (*table[
(cond_zero(a)) |
(cond_lt(a,b) << 1) |
(cond_lt(b,a) << 2)]) (s1 + 1, s2 + 1);
}
0071デフォルトの名無しさん
2006/03/17(金) 20:32:25ちょっと感動した。
やはり、関数呼び出しも制御構文だな。
0072デフォルトの名無しさん
2006/03/17(金) 23:08:51//---------------------------------------
// 型定義&プロトタイプ宣言
typedef int data_t; // 任意のデータ型
typedef data_t (*func_t) (data_t); // 一引数関数
data_t call_n_times (int n, func_t f, data_t x);
//---------------------------------------
// 関数定義
int cond_lt (int a, int b) { return ((a-b)>>31)&1; }
data_t call0 (int n, func_t f, data_t x) { return x; }
data_t call1 (int n, func_t f, data_t x) { return f (x); }
data_t call2ormore (int n, func_t f, data_t x) {
return call_n_times (n/2, f, call_n_times (n-n/2, f, x));
}
data_t call_n_times (int n, func_t f, data_t x) {
data_t (*table[3]) (int, func_t, data_t) = {
call0, call1, call2ormore
};
return (*table[cond_lt(0,n) + cond_lt(1,n)]) (n, f, x);
}
//-----------------------------------
// 使い方サンプル:1〜100000を表示する
#include <stdio.h>
data_t print_and_increment (data_t x) {
printf ("%d\n", x); return x+1;
}
int main (int argc, char** argv) {
call_n_times (100000, print_and_increment, 1);
return 0;
}
0073デフォルトの名無しさん
2006/03/17(金) 23:20:50関数呼び出しを禁止されるとCでは何も出来ないのですが・・・
0074デフォルトの名無しさん
2006/03/18(土) 00:07:230075デフォルトの名無しさん
2006/03/18(土) 16:49:33へー(゚Д゚)
仕事何やってる人なの?
0076デフォルトの名無しさん
2006/03/18(土) 19:13:01帝王ですお
0077デフォルトの名無しさん
2006/03/18(土) 19:23:40そこに if がないからだ
0078http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 20:06:30もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
0079デフォルトの名無しさん
2006/03/25(土) 06:02:570080デフォルトの名無しさん
2006/03/25(土) 10:14:380081デフォルトの名無しさん
2006/03/25(土) 12:44:190082デフォルトの名無しさん
2006/03/25(土) 12:56:54作れば
確かにifはいらなくなるw
0083デフォルトの名無しさん
2006/03/25(土) 15:24:46それ実装してみ
0084デフォルトの名無しさん
2006/03/25(土) 18:27:110085デフォルトの名無しさん
2006/03/25(土) 19:54:10いいえ、ここはマゾの集まるスレです。
0086デフォルトの名無しさん
2006/03/25(土) 23:06:43>>86
なんのために?
0087デフォルトの名無しさん
2006/03/25(土) 23:21:280088デフォルトの名無しさん
2006/03/26(日) 17:09:46>条件分岐一度も使わない関数ライブラリ作らね?
> >>86
> なんのために?
警告 : 実行されないコードです
> なんのために?
0089デフォルトの名無しさん
2006/04/06(木) 18:02:44>>86
なんのために?
}
0090デフォルトの名無しさん
2006/05/11(木) 20:51:28もう一度ぬくもりを・・・
0091デフォルトの名無しさん
2006/05/12(金) 23:01:340092デフォルトの名無しさん
2006/05/13(土) 00:22:140093デフォルトの名無しさん
2006/05/15(月) 15:16:38>>14
0094デフォルトの名無しさん
2006/08/13(日) 19:52:510095デフォルトの名無しさん
2006/08/13(日) 19:53:260096デフォルトの名無しさん
2006/08/30(水) 11:42:49> while(false){
> }
> 終了処理
いきなり終了してるじゃん。
do { ... } while (0);
の間違いか?
0097デフォルトの名無しさん
2006/08/31(木) 15:37:33ifを使ってない掲示板に書き込むべき
0098test
2006/11/26(日) 21:59:590099デフォルトの名無しさん
2006/12/02(土) 01:17:18こんな言語どう?
10 VALUE IS 20
20 PRINT "20"
30 IS VALUE 20
40 COME FROM 90
50 PRINT "40"
60 COME FROM 20
70 PRINT "60"
80 BECAUSE OF 30
90 PRINT "80"
で、実行結果が
20->60->80->40->60->80->...
となるの。結果から遡ってフロー記述を行うタイムマシン型プログラミング。
0100デフォルトの名無しさん
2006/12/02(土) 13:14:13それ、ifって言ってないだけでif的な機能全開じゃねぇ?
0101デフォルトの名無しさん
2006/12/02(土) 13:42:01なら、全部「AはBに依存する」宣言型パターンマッチ構造にして、
ループは再帰で書けば追放できるか?
FOO(N): BAR; FOO(n -1);
FOO(0): 0
要するにPrologか。
0102デフォルトの名無しさん
2006/12/04(月) 03:55:000103デフォルトの名無しさん
2006/12/04(月) 04:09:050104デフォルトの名無しさん
2006/12/09(土) 16:49:38そんな話、だれにきいたんだよ。
0106デフォルトの名無しさん
2006/12/09(土) 17:34:320107デフォルトの名無しさん
2006/12/09(土) 19:59:54たぶんifTrue: とかのことかと思われ
0108デフォルトの名無しさん
2006/12/09(土) 20:01:05enable_if
はOKですか?
0109デフォルトの名無しさん
2006/12/10(日) 02:05:390110デフォルトの名無しさん
2006/12/13(水) 21:33:46「リファクタリング」とか読むと、
if文なくしていくように思えるかも。
0111デフォルトの名無しさん
2006/12/13(水) 22:59:48If I were a train, I'd be late.
And if I were a good man, I'd talk with you more often than I do.
0112デフォルトの名無しさん
2006/12/14(木) 14:07:590113デフォルトの名無しさん
2007/04/22(日) 13:19:070114デフォルトの名無しさん
2007/04/22(日) 13:34:360115デフォルトの名無しさん
2007/04/22(日) 13:53:300116デフォルトの名無しさん
2007/04/22(日) 14:02:110117デフォルトの名無しさん
2007/04/22(日) 22:07:04昔のLISPだとifよりもcond中心で、ifはマクロで作られたとか何とかと聞いたことがある。
0118デフォルトの名無しさん
2007/04/27(金) 12:20:05Prologだと普通ifは使わない。入ってる処理系もあるが。
0119デフォルトの名無しさん
2007/04/27(金) 21:44:010120デフォルトの名無しさん
2007/04/29(日) 07:33:240121デフォルトの名無しさん
2007/04/29(日) 07:36:090122デフォルトの名無しさん
2007/04/29(日) 11:04:21「計算形GOTO文」とか「割り当て形GOTO文」とかがあってな・・・
0123デフォルトの名無しさん
2007/04/29(日) 14:01:47■ このスレッドは過去ログ倉庫に格納されています