トップページ⇒tech
123コメント28KB

帝王にifなどいらぬ!

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/01/19(木) 16:30:19
こ、こんなに悲しいのなら・・・苦しいのなら・・・ifなどいらぬ!
オレはその時からifを捨てた!
いや、自虐プログラマの血が目覚めたのだ!

というわけで、便利なifをあえて捨てたプログラミングを語ろう。
0002デフォルトの名無しさん2006/01/19(木) 16:34:53
return is_fool( _1 ) ? EXIT_FAILURE : EXIT_SUCCESS;
0003デフォルトの名無しさん2006/01/19(木) 16:34:59
3項演算子だけで十分ってこと?
0004デフォルトの名無しさん2006/01/19(木) 16:51:01
int main()
{
return 0;
}
0005デフォルトの名無しさん2006/01/19(木) 17:03:44
inline int max(int x, int y)
{
    int a[] = {x, y};
    return a[x < y];
}
0006デフォルトの名無しさん2006/01/19(木) 17:29:44
ifとswitchと?演算子無しでプログラムを作ろう。
オレはヤダ
0007デフォルトの名無しさん2006/01/19(木) 17:32:06
どっちかというならswitchいらないかな
0008デフォルトの名無しさん2006/01/19(木) 17:33:17
何が帝王なんだろう
0009デフォルトの名無しさん2006/01/19(木) 19:41:44
その部分だけインラインアセンブラでcmp使ったり
0010デフォルトの名無しさん2006/01/19(木) 19:54:31
Perlでif使わないで3項演算子だけでプログラム書いたなあ
0011デフォルトの名無しさん2006/01/19(木) 20:16:14
ifを使わない人=聖帝
ifを使う人=下郎
else ifを使う人=子供
0012デフォルトの名無しさん2006/01/19(木) 21:51:57
while (x == y) { // if
    hoge();
    break;
}
while (x != y) { // else
    fuga();
    break;
}

こんなん?
0013デフォルトの名無しさん2006/01/20(金) 00:56:49
このスレ言語指定してないよな・・・

Perlならunlessで決まり!
0014デフォルトの名無しさん2006/01/20(金) 08:46:48
ifってなんですか?
http://pc8.2ch.net/test/read.cgi/tech/1036013915/l50
0015デフォルトの名無しさん2006/01/20(金) 11:02:52
&& と || で代用。
0016デフォルトの名無しさん2006/01/20(金) 21:04:32
お前らアフォか。
ifなど要らぬってことは条件分岐禁止ってことだ。
バグの80%は条件分岐に起因するという。
条件分岐を廃したソリッド・プログラミングを目指すんだ!
0017デフォルトの名無しさん2006/01/21(土) 00:53:51
if(A)B else if(C)D else E;
は
A&&B||C&&D||E
で代用できるしな。
0018デフォルトの名無しさん2006/01/21(土) 01:34:08
>>17
それってコンパイラの実装によりそうな気がするんだが、
途中で以降の処理を中断とかってできるん?

あと、BとCが副作用を起こさないメソッドでないといけない気もする。
0019デフォルトの名無しさん2006/01/21(土) 03:09:04
>>18
よりません。
0020デフォルトの名無しさん2006/01/21(土) 03:55:27
>>17
Bが偽と評価されるようなコードだと使えないよ。
0021デフォルトの名無しさん2006/01/21(土) 08:31:00
カンマ演算子使えば使える
0022デフォルトの名無しさん2006/01/21(土) 11:56:15
>>20
Bの最後で1を返せばいいだけだろ。
0023デフォルトの名無しさん2006/01/21(土) 13:17:28
>>22
>>21
つまり、
A && (B, 1) || C && (D, 1) || E;
それも手なんだが、関数ポインタ配列を使えば条件分岐(含む&&、||)一切無しのコーディングができるな。
0024デフォルトの名無しさん2006/01/21(土) 14:08:44
void (*hoge[])()={hoge1,hoge2};
hoge[a==b]();

ってこと?
0025デフォルトの名無しさん2006/01/21(土) 19:46:01
あんまり関係ないと思うけど、
A < B の時は1、 B > Aは0を返す関数f(A, B)って1行で書けます?
もちろんif等のbool値による分岐は無しで。
0026デフォルトの名無しさん2006/01/21(土) 20:23:29
int f(int A, int B)
{
    return A < B;
}


function f(A, B) {
    return return (A < B) | 0;
}
0027デフォルトの名無しさん2006/01/21(土) 20:24:44
returnがダブってた...

function f(A, B) {
    return (A < B) | 0;
}
0028デフォルトの名無しさん2006/01/21(土) 22:18:43
>>25
A < B → 1
B > A == A < B → 0 ???

>>27
何がしたい。 0とのorは何の意味もないぞ。
0029デフォルトの名無しさん2006/01/21(土) 22:51:23
>>28
//ヒント:
function f(A, B) {
return {"true":1, "false":0}[A < B];
}
0030デフォルトの名無しさん2006/01/22(日) 03:35:15
>>29
それはなんのヒント? つーか、>28に書かれていることが理解できている?
0031デフォルトの名無しさん2006/01/22(日) 10:55:01
A < Bの結果はboolだからintになおすために|0してんじゃないの?
0032デフォルトの名無しさん2006/01/22(日) 11:58:43
さっきから必死に言い訳している香具師、痛いってば。
boolからintにするためにor? どこの言語だそれ。
0033デフォルトの名無しさん2006/01/22(日) 11:59:56
それはいいとして、結局>25は何をしたかったんだろう。
もしかしたら、A < Bは1、A > Bは0と言いたかったのか?
#それでもA == Bはどうするって問題が残るが。
0034デフォルトの名無しさん2006/01/22(日) 12:29:38
>>31
正解
BooleanをNumberに変換する定石
0035252006/01/22(日) 19:03:35
すみません。間違えてました。
A < B なら1、B >= Aなら0でした。
0036デフォルトの名無しさん2006/01/22(日) 19:05:31
A < B ? 1 : 0;
0037デフォルトの名無しさん2006/01/22(日) 22:35:41
>>32
どうみてもJavascriptです。
本当にありがとうございました。
0038デフォルトの名無しさん2006/01/26(木) 00:43:31
おい下郎ども
条件分岐せずに素数を計算するプログラム書いてみろ
0039デフォルトの名無しさん2006/01/26(木) 18:16:51
>>38
#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:08
ヒィィ
0041デフォルトの名無しさん2006/02/11(土) 20:15:31
おいお前ら。FCの名作ソフト「いっき」のオンライン対戦するぞ!
↓
http://game.coden.ntt.com/games/ikki.html

King of Wands
http://game.coden.ntt.com/kingofwands/
0042デフォルトの名無しさん2006/02/11(土) 20:47:30
gotoを使わずにgotoしてる例なら見た事あるよ。

while(false){
  処理
  if (エラー){
    break;
  }
  処理
  if (エラー){
    break;
  }
  処理
}
終了処理

こんなの。
素直にgoto使えっての。
0043デフォルトの名無しさん2006/02/11(土) 21:05:49
>>42
switch (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
>>44
こちらへお越し下さい
http://pc8.2ch.net/test/read.cgi/tech/1036013915/l50
0046デフォルトの名無しさん2006/02/12(日) 05:52:32
なんだか解らんが、
&&と||があればifなんか無くても ?: で全て済むだろ。

と、ログ全く読まずにレス。
0047デフォルトの名無しさん2006/02/12(日) 09:58:41
帝王はif(条件分岐)など使わずにmax関数を作る。

inline max(int a, int b)
{
  return ((a^b)&((a-b)>>31))^a;
}
0048デフォルトの名無しさん2006/02/12(日) 10:01:20
>>39
ループ判定で条件分岐してるじゃん
0049デフォルトの名無しさん2006/02/12(日) 12:21:13
どうせなら
for while if ? switch 無しで
0050デフォルトの名無しさん2006/02/12(日) 16:10:27
>>49
それを言うなら、&&や||のショートサーキット評価だって条件分岐だ
0051デフォルトの名無しさん2006/02/19(日) 11:58:27
プログラムを構成する最低限絶対に必要なものは条件付転送。
これさえあればプログラムは全て表現可能になる。

条件は無条件を含むし、転送は相手先がプログラムカウンタを
含むから、条件(&無条件)分岐は必ず含まれることになる。
0052デフォルトの名無しさん2006/02/21(火) 22:42:11
cmovがあればjmpとかcallとかはいりませんか。
0053デフォルトの名無しさん2006/02/22(水) 16:41:36
>51 が言うには、それらはプログラムカウンタ(call の場合はリンクレジスタも)への無条件転送。




・・・条件設定命令はいらんのか? >51
0054デフォルトの名無しさん2006/02/23(木) 20:06:05
>>53
条件は転送の結果でもあるし、フラグを表現する領域への転送としても表現できる。
0055デフォルトの名無しさん2006/02/24(金) 11:50:16
>>54
>>>53
> 条件は転送の結果でもあるし、フラグを表現する領域への転送としても表現できる。
後者は分かるが、前者は、そんな副作用を突然持ち出されても困る。

だったら、条件付転送だって、演算結果を転送する命令でしかないだろう。
ということは条件付転送なんていらぬのだ。演算結果を転送する命令があればよい。
0056デフォルトの名無しさん2006/02/24(金) 16:28:08
演算は条件付転送を使って書くものだから、条件付転送なんて
いらんといわれても困る。

それに条件判断するところは一番単純化すれば転送の結果が
ゼロか1かだろう。

転送の結果のゼロか1かをフラグとして使えないなら条件判断が
否定されることになる。
0057デフォルトの名無しさん2006/02/24(金) 22:57:36
いーや、条件判断も演算だ。
0058デフォルトの名無しさん2006/02/25(土) 00:03:28
話が抽象的すぎてほとんど意味がなくなってる気がする。
たとえばデクリメントを条件付き転送で実現するにはどうするんだ?
これができればほかのすべての演算ができそうだが、方法を思いつかない。

lea r0,(r0-1) if always とか・・・って反則だ。
0059デフォルトの名無しさん2006/02/25(土) 00:26:47
load r0,0 if r0==1
load r0,1 if r0==2
...

とかすればいいのか。馬鹿だ俺。
0060デフォルトの名無しさん2006/02/25(土) 10:15:04
もとをただせばフリップフッロプでおk
0061デフォルトの名無しさん2006/02/25(土) 13:20:26
>>58
ネタスレでネタを展開してるのに意味を問うなよw
0062デフォルトの名無しさん 2006/03/13(月) 11:41:54
>>1は、北斗のサウザーさんですね
媚びぬ退かぬ顧みぬなんて言ってる人が
語ろうなんて言っちゃだめ
0063デフォルトの名無しさん2006/03/13(月) 12:46:56
よく、コントロールのboolean型のプロパティで使うよね。
変数aとbが同じ値なら表示、違う値なら非表示

EditBox.Visible = (a = b)
0064デフォルトの名無しさん2006/03/13(月) 13:04:01
条件付転送のみと言っても記憶媒体に演算ユニットをマッピングすればって条件付だとちゃんと言わなきゃダメでしょ
0065デフォルトの名無しさん2006/03/13(月) 14:41:00
分岐ひとつにつき小人さん一人お願いします
0066デフォルトの名無しさん2006/03/13(月) 18:10:03
結局完璧なのは>>47だけか。
0067デフォルトの名無しさん2006/03/13(月) 22:41:41
帝王にifはいらねって、if文じゃなくて、構造化プログラミングでいう、分岐構造の
ことじゃねぇ?だから、分岐してるプログラムはifつかってるのと一緒。
0068デフォルトの名無しさん2006/03/14(火) 02:25:40
もしああならこう。もしこうならああ。
こんな後ろ向きな考えでどうするか!
0069デフォルトの名無しさん2006/03/15(水) 10:59:15
DSP使えば良いじゃん
0070デフォルトの名無しさん2006/03/17(金) 20:12:08
// if, 3項演算子, その他の制御構文を使わずに strcmp を実装する
int 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
>>70
ちょっと感動した。
やはり、関数呼び出しも制御構文だな。
0072デフォルトの名無しさん2006/03/17(金) 23:08:51
// f(f(f(f(...f(x)...)))) を計算する (fをn回繰り返す)
//---------------------------------------
// 型定義&プロトタイプ宣言
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
>>71
関数呼び出しを禁止されるとCでは何も出来ないのですが・・・
0074デフォルトの名無しさん2006/03/18(土) 00:07:23
main()関数が呼べません ><
0075デフォルトの名無しさん2006/03/18(土) 16:49:33
>>70>>72
へー(゚Д゚)
仕事何やってる人なの?
0076デフォルトの名無しさん2006/03/18(土) 19:13:01
>>75
帝王ですお
0077デフォルトの名無しさん2006/03/18(土) 19:23:40
なぜ if を使わないのか?
そこに if がないからだ
0078http://www.vector.co.jp/soft/win95/util/se072729.html2006/03/18(土) 20:06:30
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
0079デフォルトの名無しさん2006/03/25(土) 06:02:57
制御構文は読みにくくなるから使うの禁止
0080デフォルトの名無しさん2006/03/25(土) 10:14:38
頭のおかしい人がいるスレはココですか?
0081デフォルトの名無しさん2006/03/25(土) 12:44:19
if(織田信長 != 本能寺で最期)
0082デフォルトの名無しさん2006/03/25(土) 12:56:54
if()に相当するメソッド,クラスを
作れば
確かにifはいらなくなるw
0083デフォルトの名無しさん2006/03/25(土) 15:24:46
>>82
それ実装してみ
0084デフォルトの名無しさん2006/03/25(土) 18:27:11
馬鹿言語スモールトークです。
0085デフォルトの名無しさん2006/03/25(土) 19:54:10
>>80
いいえ、ここはマゾの集まるスレです。
0086デフォルトの名無しさん2006/03/25(土) 23:06:43
条件分岐一度も使わない関数ライブラリ作らね?
>>86
なんのために?
0087デフォルトの名無しさん2006/03/25(土) 23:21:28
>>86無限ループワロタ
0088デフォルトの名無しさん2006/03/26(日) 17:09:46
>>86
>条件分岐一度も使わない関数ライブラリ作らね?
> >>86
> なんのために?

警告 : 実行されないコードです
> なんのために?
0089デフォルトの名無しさん2006/04/06(木) 18:02:44
while(TRUE){
>>86
なんのために?
}
0090デフォルトの名無しさん2006/05/11(木) 20:51:28
い・・・ifさん・・・
もう一度ぬくもりを・・・
0091デフォルトの名無しさん2006/05/12(金) 23:01:34
そういえば、ifすら構文にない言語なかったけ?
0092デフォルトの名無しさん2006/05/13(土) 00:22:14
がらくた言語スモールトークです。
0093デフォルトの名無しさん2006/05/15(月) 15:16:38
>>91
>>14
0094デフォルトの名無しさん2006/08/13(日) 19:52:51
 
0095デフォルトの名無しさん2006/08/13(日) 19:53:26
 
0096デフォルトの名無しさん2006/08/30(水) 11:42:49
>>42
> while(false){
> }
> 終了処理

いきなり終了してるじゃん。

do { ... } while (0);
の間違いか?
0097デフォルトの名無しさん2006/08/31(木) 15:37:33
>>1
ifを使ってない掲示板に書き込むべき
0098test2006/11/26(日) 21:59:59
<![CDATA[a]]>
0099デフォルトの名無しさん2006/12/02(土) 01:17:18
>>91
こんな言語どう?

 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
>>99
それ、ifって言ってないだけでif的な機能全開じゃねぇ?
0101デフォルトの名無しさん2006/12/02(土) 13:42:01
IFじゃなくて条件判定フローを意識させること自体だめなのか。
なら、全部「AはBに依存する」宣言型パターンマッチ構造にして、
ループは再帰で書けば追放できるか?

FOO(N): BAR; FOO(n -1);
FOO(0): 0

要するにPrologか。
0102デフォルトの名無しさん2006/12/04(月) 03:55:00
ifは使わずすべてswitchで表現
0103デフォルトの名無しさん2006/12/04(月) 04:09:05
main(int argc, char**argv){argc=1/(argc-1), puts("パラメータをいれないで"); return 0}
0104デフォルトの名無しさん2006/12/09(土) 16:49:38
オブジェクト指向徹底するとif文がなくなるそうですがそれ本当に見やすい?
0105デフォルトの名無しさんNGNG?2BP(294)
>>104
そんな話、だれにきいたんだよ。
0106デフォルトの名無しさん2006/12/09(土) 17:34:32
まぁ、確かにif文が減る場所はあるけどな。
0107デフォルトの名無しさん2006/12/09(土) 19:59:54
>>105
たぶんifTrue: とかのことかと思われ
0108デフォルトの名無しさん2006/12/09(土) 20:01:05
type_traints
enable_if
はOKですか?
0109デフォルトの名無しさん2006/12/10(日) 02:05:39
オレ的にはプログラマ終了だな・・・
0110デフォルトの名無しさん2006/12/13(水) 21:33:46
>>104
「リファクタリング」とか読むと、
if文なくしていくように思えるかも。
0111デフォルトの名無しさん2006/12/13(水) 22:59:48
If I were a swan, I'd be gone.
If 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:59
Why do you say that?
0113デフォルトの名無しさん2007/04/22(日) 13:19:07
>>100
0114デフォルトの名無しさん2007/04/22(日) 13:34:36
ただのネタスレかと思いきや、微妙に良スレでワラタw
0115デフォルトの名無しさん2007/04/22(日) 13:53:30
表面上のifを取っ払うのは難しくないけど
0116デフォルトの名無しさん2007/04/22(日) 14:02:11
Dのstatic ifはC++にも欲しいなぁ
0117デフォルトの名無しさん2007/04/22(日) 22:07:04
>>91
昔のLISPだとifよりもcond中心で、ifはマクロで作られたとか何とかと聞いたことがある。
0118デフォルトの名無しさん2007/04/27(金) 12:20:05
>>1
Prologだと普通ifは使わない。入ってる処理系もあるが。
0119デフォルトの名無しさん2007/04/27(金) 21:44:01
if がなければ goto を使えばいいじゃない  by まりぃ
0120デフォルトの名無しさん2007/04/29(日) 07:33:24
jmpのオペランドに直接アドレスを書き込むの意味かな
0121デフォルトの名無しさん2007/04/29(日) 07:36:09
ゴメン、レジスタでいいのか
0122デフォルトの名無しさん2007/04/29(日) 11:04:21
昔、FORTRANには単純に1つの文番号(行番号)に飛ぶGOTO文の他に
「計算形GOTO文」とか「割り当て形GOTO文」とかがあってな・・・
0123デフォルトの名無しさん2007/04/29(日) 14:01:47
つ gcc
■ このスレッドは過去ログ倉庫に格納されています