Cプログラムは嫌がらせのためだけに存在する

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
それぐらい分かれ、コンパイルしる!
2デフォルトの名無しさん:2005/08/09(火) 21:05:31
最高に頭悪そうな発言してください in ム板 (VI)
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
3デフォルトの名無しさん:2005/08/09(火) 21:34:14
マニアは「それを越えられない方が悪い」ぐらいに言う。
こんなつまらない物に労力かけられるか
4デフォルトの名無しさん:2005/08/09(火) 21:50:24
Cは「それくらいやってくれ」を別の意味で補完してくれるんだよ。
高級すぎると重箱の隅が突けないから、Cに頼る羽目になる。
最近のJavaは恐ろしいほど柔軟だけどね・・・
5デフォルトの名無しさん:2005/08/09(火) 21:53:22
Cプログラムって事はコンパイル済みのプログラム全部(Cで書かれたもの)に対
して不満があるんですよね。
6デフォルトの名無しさん:2005/08/09(火) 22:25:04
Cプログラマーってワザと分かり難いプログラム書いて、自慢するよな。
たぶん、そう言う書き方を推奨してるK&Rが全て悪い。
7デフォルトの名無しさん:2005/08/10(水) 06:51:05
Perlプログラマーってワザと分かり難いスクリプト書いて、自慢するよな。
たぶん、そう言う書き方しか出来ないPerlが全て悪い。
8デフォルトの名無しさん:2005/08/10(水) 12:01:01
Cが必要なところなんて、本当に、本当にごくごく限られたところでしかないだろ。
せめてC++に移行してくれ。
9データボックス:2005/08/10(水) 12:45:03
高級アセンブリ言語Cを使わなくてどうするんだ
10デフォルトの名無しさん:2005/08/10(水) 12:47:10
11デフォルトの名無しさん:2005/08/10(水) 12:53:27
何このスレ
12データボックス:2005/08/10(水) 12:58:30
何の言語を一番気に入ってるのかね。
Windowsアプリの作りやすさに終始するならVBでいいんじゃないか。
13デフォルトの名無しさん:2005/08/10(水) 19:11:08
>>6
これにはおれも同意
絶対に分りやすいことが第一だ!
10行を4行に縮めて、見にくくなってるのに、なぜそんなに得意げなんだ!?
14データボックス:2005/08/10(水) 19:37:17
>>13
1行当たりにたくさん詰め込みすぎた複雑な式のことかいな。
15デフォルトの名無しさん:2005/08/10(水) 20:01:23
>>13
分かり難いって例えばどんなのを言ってるんですか?具体的に。
16デフォルトの名無しさん:2005/08/10(水) 21:11:45
while(0 == (n = hoge()))
{
//statement
}
17データボックス:2005/08/10(水) 21:27:10
どうせ代入しながら評価するなら、カンマ演算子を使うほうが良くないか。

while(n = hoge(), !n)
{
//statement
}
18デフォルトの名無しさん:2005/08/10(水) 21:29:53
そんなのあんの?Cの知らない機能って結構あるのかも
19データボックス:2005/08/10(水) 22:20:50
>>13
俺も他人のコードは1行に詰め込みすぎて読みにくいと思うことは多い。
これはどう思うかいな。

何人かの trim() 関数が書き込まれているが、自分のものと比べると、
>余力のあるものはコードを極限まで短くしてみよ。
となっているからか、短くしようと努力しているのかも知れないが、
行数で見れば少なく済ませているかも知れないが、計算量は
特に少なく抑えられているとは思えず、単に1行当たりに詰め込み
すぎてるだけのような気がするんだが。

http://pc8.2ch.net/test/read.cgi/tech/1121471445/962-
http://pc8.2ch.net/test/read.cgi/tech/1122705615/60-72


http://pc8.2ch.net/test/read.cgi/tech/1121471445/976
20デフォルトの名無しさん:2005/08/10(水) 22:44:40
>>19
・ループは二回で済む。三回回しているのは明らかに冗長。
・isspace()を使わずに、制御文字を全て空白と見做すのは明らかな怠慢。
21デフォルトの名無しさん:2005/08/10(水) 23:04:52
>>20
>・ループは二回で済む。三回回しているのは明らかに冗長。
しかし、strlen()をしてるものが多いが、その関数の内部では同じようにループ
をしてるわけだが。
22デフォルトの名無しさん:2005/08/10(水) 23:32:18
#include <ctype.h>
char *trim(char *str)
{
  char *src, *dst, *last;
  if( str == NULL ) return NULL;
  for(src = str; isspace(*src); ++src) ;
  if(src == '\0') { *str = '\0'; return str; }
  last = str - 1;
  for(dst = str; *src != '\0'; ++dst, ++src)
  {
    *dst = *src;
    if(!isspace(*src))
    {
      last = dst;
    }
  }
  *(last + 1)= '\0';
  return str;
}
2322:2005/08/10(水) 23:38:29
ちと整理。ひとつ不要な判定があった。

#include <ctype.h>
char *trim(char *str)
{
  if( str != NULL )
  {
    char *src, *dst, *last;

    for(src = str; isspace(*src); ++src) ;

    last = str - 1;

    for(dst = str; *src != '\0'; ++dst, ++src)
    {
      *dst = *src;
      if(!isspace(*src)) last = dst;
    }

    *(last + 1)= '\0';
  }

  return str;
}
24デフォルトの名無しさん:2005/08/10(水) 23:45:21
>>22
ほお、すごいな。
そういえば、最初のNULLチェックもちゃんと付けてるな。
でも、
>if(src == '\0') { *str = '\0'; return str; }
if(*src == '\0')
じゃないかな。
とりあえず、22を確認してみたけど、23はこれを書き込んでからな。
25デフォルトの名無しさん:2005/08/10(水) 23:49:19
あっ、最初のNULLチェックで、引数がNULLならその引数をそのまま返せば
NULLを返すというわけだな。
2622:2005/08/10(水) 23:51:15
>>24
指摘のとおりそこは *str でした。
でもそこで判定しなくても、その後のfor の継続判定が同じだったので、そもそもその判定自体がいらなかった。
27デフォルトの名無しさん:2005/08/11(木) 00:27:17
>>22 (23)
ふむ、それと、str != NULL のときだけ変数を生成するようにブロック内変数にしたんだな。
ただ、引数 str の先頭からコピーし直すようなことまでは、しなくていいと思うんだが。
2822=23:2005/08/11(木) 00:30:33
なんかおちてたな。
さて、>>23 には実は無駄がある。
*dst = *src のところで、right trim で取り除かれるべき空白文字まで無駄にコピーしている。
最終的に*(last+1)='\0' でコピーした余白が切り取られるのだが、それにしても無駄。
そこに注目して、修正してみた。
#include <string.h>
#include <ctype.h>
char *trim(char *str)
{
  if( str != NULL )
  {
    char *begin, *end, *p;
    int len;

    for(begin = str; isspace(*begin); ++begin) ;

    end  = str - 1;

    for(p = begin; *p != '\0'; ++p)
      if(!isspace(*p)) end = p;

    *(++end)= '\0';

    if( (len = (end - begin)) > 0 )
      memmove(str, begin, len + 1);
  }

  return str;
}

memmove をしているわけだが、果たして >>23 とどっちが効率いいのか。微妙。
29デフォルトの名無しさん:2005/08/11(木) 00:35:57
>>27
なるほど、それでいいなら、もっと簡単になるな。
30データボックス:2005/08/11(木) 02:15:05
#include <ctype.h>

char *trim(char *str)
{
  char *pc1, *pc2, *pc3;
  
  if (str == NULL)
    return NULL;

  for (pc1 = str; isspace(*pc1); pc1++)
    ;

  pc3 = pc1;
  for (pc2 = pc1; *pc2; pc2++)
    if (!isspace(*pc2))
      pc3 = pc2;

  *(++pc3) = '\0';

  return pc1;
}
31デフォルトの名無しさん:2005/08/11(木) 04:35:53
あのさぁ、途中に空白あったらその後捨てちゃうわけ?
で、詰め直しをする必要もないから1ループで事足りるんですが。
詰めることばっかりに夢中になって本質を見失うなんて頭足りないんじゃない?
32デフォルトの名無しさん:2005/08/11(木) 04:38:42
たかがCひとつ満足に理解できない馬鹿の立てたスレは、ここでっか?
33デフォルトの名無しさん:2005/08/11(木) 04:45:13
>>31の言ってることは最初は無茶苦茶だが後半に同意。
ということで、1ループで事足らせてみた。
char * trim(char * str)
{
if (str) {
char * first;
char * last;
for (first = NULL; * str; ++str) {
if (!isspace(* str)) {
if (!first) {
first = str;
}
last = str;
}
}
if (first) {
* ++last = '\0';
return first;
}
}
return str;
}
較べたわけじゃないけど、isspace()が散らばらない分コードはタイトでしょ。
34デフォルトの名無しさん:2005/08/11(木) 05:17:54
>>30
空白だけの文字列を食わせるとナルキャラの先を壊す。
35デフォルトの名無しさん:2005/08/11(木) 09:29:55
>>6
CにしろPerlにしろC++にしろ
書く奴によって差がとんでもなく開きすぎるあんなに
読みにくいコードを簡単に書くことができてしまうのは
なんともなんとも。
STLが気に入らないからVectorを自作だなんだとか
ヘッダファイル問題で苦しめられる始末といい

コーディング規約を見直したほうがいいんじゃないのか?
36デフォルトの名無しさん:2005/08/11(木) 09:41:16
ここでBASICに帰ろう
37データボックス:2005/08/11(木) 10:10:54
>>31
>で、詰め直しをする必要もないから1ループで事足りるんですが。
しかし、ループ箇所を少なくするだけでは良いとは限らないんじゃないか。
そのためにループ内で幾つもの評価式を並べて、全体の式の評価回数を増やすだけに
なるようなものでは、良いとは言えない。
38データボックス:2005/08/11(木) 10:14:27
>>34
pc3 = pc1; を
pc3 = pc1 - 1; に直す。
39データボックス:2005/08/11(木) 11:29:16
俺としては、if や while や for などに対応する文は、規則正しく常に次の行に書いてもらえたほうがいい。
それと、書き込むときは、字下げのためのスペースやタブは、全角のスペースに変換すると、体裁が保たれる。
4034:2005/08/11(木) 12:37:34
>>39
2バイト空白はなぁ……評価するときに、変換する手間が掛かるんだけど。
それよりは、エディタにインデント掛けて貰う方が楽だが。
1行目はそうだけど、それよりもブロック化してないことのほうが気になる。
つーか、>30の変数名は如何なものかと。
>28とか>33の方がその点は読みやすいと思うのだが。

そうそう、Cygwinでコンパイルした結果だと、>33が一番短くて
メモリアクセスも少ないコードになったよ。ループ内の分岐は>30の方が少ないけどね。
41データボックス:2005/08/11(木) 12:57:29
>>40
>2バイト空白はなぁ……評価するときに、変換する手間が掛かるんだけど
意味が分かりにくいが、もしかして、
>それと、書き込むときは、字下げのためのスペースやタブは、全角のスペースに変換すると、体裁が保たれる。
が正しく伝わってないのかな。「書き込むときは」とは、この掲示板に書き込むときのことを言ってるんだが。
普通に投稿すれば、字下げのないソースのレスになってしまうから、それを問題にして言ってるんだが。
4234:2005/08/11(木) 13:11:03
>>41
ヒント:私は>34と>40を書いている。
#どっちが読解力ないのかな?w
43データボックス:2005/08/11(木) 13:20:24
>>42
全然意味がわからないんだが。
>#どっちが読解力ないのかな?w
の意味もわからないんだが。
44デフォルトの名無しさん:2005/08/11(木) 13:24:36
ヒント:なんて使ってる奴はみんな痛い
4534:2005/08/11(木) 13:39:40
はぁ…
ソースを読むときではなく、コンパイルするときに余計な手間が掛かるということが読み取れないもんかねぇ。
読むだけなら別にわざわざインデントしなくても読むのに困らんし、
困るならエディタにインデント掛けて貰えばいいだろうと。
つーか、わざわざ変換するなら>28を見習えと言いたい。
#>28ならコピペでそのままコンパイルできる。
46データボックス:2005/08/11(木) 13:48:44
>>45
>ソースを読むときではなく、コンパイルするときに余計な手間が掛かるということが読み取れないもんかねぇ。
人にわかりやすく話すことができないのかね。
>読むだけなら別にわざわざインデントしなくても読むのに困らんし、
>困るならエディタにインデント掛けて貰えばいいだろうと。
>つーか、わざわざ変換するなら>28を見習えと言いたい。
>#>28ならコピペでそのままコンパイルできる。
随分自己中心的だな。
嫌ならわざわざコンパイルしなければいいだろ。
自分は何様のつもりだ。
47デフォルトの名無しさん:2005/08/11(木) 13:52:18
コンパイルするときにはわざわざ手打ちしろってか?w
48データボックス:2005/08/11(木) 13:54:08
>>45
それに、その非常識の考えが前提の話なら、普通の人がそう簡単に理解できると思うか?

>>47
手打ちも何もするな。
常識をわきまえることから始めろ。
49デフォルトの名無しさん:2005/08/11(木) 14:03:05
>>48
君から常識って言葉が聞かれるとは思わなかったな
オツムノ弱い子には便利な言葉だよね
50データボックス:2005/08/11(木) 14:05:29
>>49
何を言いたいのかね。
>オツムノ弱い子には便利な言葉だよね
どういう意味なのかわからないんだが。
51デフォルトの名無しさん:2005/08/11(木) 14:08:41
なにここ?雑談スレ?

"常識をわきまえる" の検索結果 約 189 件中 1 - 100 件目 (0.61 秒)
52データボックス:2005/08/11(木) 14:23:09
何も34(40, 45)を対象として元々書いてるわけじゃないんだからな。
53デフォルトの名無しさん:2005/08/11(木) 14:44:45
何きれてんの?
5445=34:2005/08/11(木) 14:51:27
>嫌ならわざわざコンパイルしなければいいだろ。
謹んであんたのハンドルをNGnameに登録させて貰うよ。
55データボックス:2005/08/11(木) 15:09:56
>>54
なぜそういうレスになるのかわからないんだが。
それよりも、自分の態度を反省するほうが大事じゃないかね。
56デフォルトの名無しさん:2005/08/11(木) 15:14:18
>>55
君には自戒と言う言葉は理解できないだろうな
57デフォルトの名無しさん:2005/08/11(木) 15:17:14
>>54
えぇ〜、勿体無い。
C言語スレとかC++移行スレなんかと楽しいレスも読めなくなっちゃうのにぃw
58データボックス:2005/08/11(木) 15:17:18
>>56
>君には自戒と言う言葉は理解できないだろうな
自戒と言う言葉は理解できても、そのレスが何を言いたいのか理解できんな。
59デフォルトの名無しさん:2005/08/11(木) 15:26:16
データボックスの発言を見ると
この男が浮かんでくるのは俺だけかな?w

ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=23444&forum=15
60データボックス:2005/08/11(木) 15:44:51
意味不明なレスが多すぎる。
もう書くな。
61デフォルトの名無しさん:2005/08/11(木) 15:54:01
夏休みになると自己陶酔型の学生似非PGが増えるのは仕方の無いこと
6222=23=28:2005/08/11(木) 19:43:36
あのあと規制に巻き込まれて最終結論がかけませんでした。
荒れちゃったようですが、一応買いときます。
>>28>>27 に言われた、所を反映。多分これが一番効率いいね。
>>30>>38の修正を入れればほぼ同じコードになりますが、こっちの方がローカル変数少ない。
たいした違いではありませんが。

#include <ctype.h>
char *trim(char *str)
{
  if( str != NULL )
  {
    char *end, *p;

    for(; isspace(*str); ++str) ;

    end  = str - 1;

    for(p = str; *p != '\0'; ++p)
      if(!isspace(*p)) end = p;
    
    *(++end)= '\0';
  }
  return str;
}
6322=23=28:2005/08/11(木) 19:46:09
しまった、最終結論これじゃなかった。
これでもいいんだけど、最初のNULLガードのところを

if( str != NULL && *str != '\0')

としたほうが、精神衛生上いいかと。
本当にどうでもいいことですが。
64デフォルトの名無しさん:2005/08/11(木) 20:36:19
コテは一人残らず死ねばいい
65デフォルトの名無しさん:2005/08/12(金) 04:08:21
a
66デフォルトの名無しさん:2005/08/12(金) 04:09:50
b
67デフォルトの名無しさん:2005/08/12(金) 04:11:02
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
68データボックス:2005/08/12(金) 04:12:17
_____
69データボックス:2005/08/12(金) 04:23:22
program trimprg(input, output);
var
  str : packed array[0..256] of char;
  pc1 : pchar;
  function isspace(c1 : char) : boolean;
    begin
      isspace := (c1 <= ' ')
            and (
70データボックス:2005/08/12(金) 04:31:21
              (c1 = '') or (c1 = '') or (c1 = '')
              or (c1 = ' ') or (c1 = chr(10)) or (c1 = chr(13))
            )
    end;
  function trim(str : pchar) : pchar;
    var
      pc1, pc2, pc3 : pchar;
      c1 : char;
    begin
      if str = nil then
        trim := nil;
71データボックス:2005/08/12(金) 04:40:06

      pc1 := str;
      while isspace(pc1^) do
        inc(pc1);

      pc3 := pc1;
      dec(pc3);
      pc2 := pc1;
      c1 := chr(0);
      while pc2^ > c1 do
        begin
          if not isspace(pc2^) then
            pc3 := pc2;
          inc(pc2)
        end;

72データボックス:2005/08/12(金) 04:43:19

      inc(pc3);
      pc3^ := c1;

      trim := pc1
    end;
  begin
    write('入力 : ');
    readln(str);
    writeln('文字列1: ''', str, '''');
    pc1 := trim(str);
    writeln('文字列2: ''', pc1, '''')
  end.
(* Copy right データボックス 2005.Inc *)
73データボックス:2005/08/12(金) 05:14:21
(* 70 *)
              (c1 = '  ') or (c1 = '') or (c1 = '')
              or (c1 = ' ') or (c1 = chr(10)) or (c1 = chr(13))
            )
    end;
  function trim(str : pchar) : pchar;
    var
      pc1, pc2, pc3 : pchar;
      c1 : char;
    begin
      if str = nil then
        begin
          trim := nil;
          exit
        end;

74デフォルトの名無しさん:2005/08/12(金) 05:14:44
copyrightとcopy rightの区別のつかないスレ違いの阿呆がいるスレはここですか?
75デフォルトの名無しさん:2005/08/12(金) 13:28:23
背伸びしたいお年頃なんだろ
76データボックス:2005/08/12(金) 14:19:47
>>69-73 Copyright (C) 2005 データボックス, All Rights Reserved.
77デフォルトの名無しさん:2005/08/12(金) 15:35:24
どうでもいいが2chに投稿した内容は
既存の著作物や犯罪に関わる事柄でない限りひろゆきのものだ。
78デフォルトの名無しさん:2005/08/12(金) 19:34:39
そんなことないはず。
複製その他の利用が自由であることに同意しないと投稿できないというだけ。
79データボックス:2005/08/12(金) 21:58:39
>>8
望み通り、高級アセンブリ言語Cではなく、その他の言語Pascalでプログラム作ったぞ。
どうだ、これで満足か?
80デフォルトの名無しさん:2005/08/20(土) 22:53:23
迷スレあげ
81デフォルトの名無しさん:2005/08/21(日) 10:43:26
初心者なので再帰関数は勘弁...
82デフォルトの名無しさん:2005/08/22(月) 02:02:38
C++の中にCプログラムてんこ盛りにするのはやめてほしい
83デフォルトの名無しさん:2005/08/22(月) 02:27:01
C++の設計者はそのような嫌がらせとしか思えない状況を実現するために
苦心惨憺して上位互換性を確保したのだw
84デフォルトの名無しさん:2005/08/23(火) 02:21:40
なんかC勉強してると自分の馬鹿さ加減に嫌気が差してきます.
ああ,もう別に優秀なプログラマーになれなくてもイイやって気分になってしまいます.
CPUのレジスタやエンディアンなんて言葉すら知らないアマの僕には...
85デフォルトの名無しさん:2005/08/23(火) 03:16:56
>>83
確かにそうとしか思えないときがある。

ugly_old_code {
 //醜いC的なコーディングはこのブロック内でのみ有効
}

という仕様にすればよかったのに
86デフォルトの名無しさん:2005/08/28(日) 23:09:06
>>81
ゲームの思考ルーチンとか
ディレクトリの階層を掘り下げたりするような探索プログラムを書くときに
再帰が使えないと、つらいじょ
87デフォルトの名無しさん:2005/09/15(木) 18:12:39
>>85
それがC++/CLIの真髄ですよ
88デフォルトの名無しさん
>>84
CPUのレジスタやエンディアンなんて必要なときにしか意識しない僕は
社会の底辺ですがどうでしょう