アカウント名:
パスワード:
int sp; // stackpointer. スタック配列の添え字として使う
よりも、
int sp; //stack pointer.スタックトップの空セルを指す。pushで増加。
int sp; //stack pointer.スタックトップのデータの入ったセルを指す。下へ延びる(pushで減少)。
みたいなことを書いてくれてた方がありがたい。
a = 10; /* 変数aに20を代入 */
pointer==NULL; pointer変数の参照しているアドレスがゼロ番地です。 pointer=malloc(10);などせずに*pointer='a'などとすると、ゼロ番地への書き込みになるため、普通のアプリケーションはセグメンテーションフォルトで落ちます。
pointer!=NULL && *pointer=='\0' pointer変数の参照しているアドレスはたぶん普通にデータをストアできる場所かもしれません。 しかし文字列としてみた場合、このポインタがさしている先の文字列の長さはゼロですので、strlen(pointer)==0が成り立ちます。 ただし、pointerのさしている先が本当にデータセグメントであるという保証はないので、ゼロ番地以外であってもおかしな場所をさしていれば、代入式は失敗し、セグメンテーションフォルトなどをやはり引き起こします。
あとはC言語での評価順序の問題がありますね。 f(a(x), b(y), c(z)); という関数呼び出しがあったとき、a(x), b(y), c(z)の各関数はどの順で呼ばれるのかCの仕様ではきまっていないのです。 つまりb(y)が呼ばれたあとにc(z)がよばれ、最後にa(x)がよばれ、引数が揃ったところでf()が呼ばれるかもしれません。もしかしたら自動並列コンパイラがa(), b(),c()が互いに素で並列に実行しても問題ないと判断したら並列に処理してしまうかもしれないのです。
ところが、 (a || b)と(a && b)と(a ,b))(カンマ演算子)と(a ? b : c)(三項演算子)では必ずaが先に評価され、その結果次第によってb, cが呼ばれるときまっています。 # ただし、ビット演算子である(a|b)や(a&b)の順序は不定。
このへんを理解していないと、
if(pointer==NULL||*pointer='\0') ;
・コメントは書くように。
なんてのは? たとえば,(悪い例)
i++; /* iを一つ増やす */ buf[strlen(buf)]='\0'; /* 配列bufのstrlen(buf)番目に'\0'を代入 */ みたいな。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア
ほとんど無い (スコア:1, すばらしい洞察)
・インデントはTabで。
・テクニックに走らず、誰が見てもわかりそうな構文で。
・できるだけ省略しないで書いて。
命名規則とかは、今の会社では無いですね。
Re:ほとんど無い (スコア:2, すばらしい洞察)
何をしているのか、ではなく、何故なのかを書けって教わりました。
そのため関数の先頭にコメントをたくさん書くようになりました(if,for等のブロックを扱うレベルで言及はあるけど)
仕事としてのプログラムを習いたての頃は"初期化する"とか後で訳のわからなくなるコメントが多かったので非常に勉強になりました。
#大人になったら何をしてるのかはコードに書いてあるってよくわかるようになったよ
Re:ほとんど無い (スコア:2, 参考になる)
良い環境ですね。良い上司、良い先輩…
悪い環境では「何を」を逐一書かないとレビュー通りませんから。
ええ。わざわざレビューでもってコードを劣悪化してるわけです。これも損失数兆円?
あと振る舞いばかり気にする連中も困る。
つまり振る舞いにはコメント逐一入れさせるいっぽうで、
変数にはコメントつけないのな。
どっちかというと、変数に「これは何か」ってコメントをつけてくれると、
そのあとのその変数の人生が想像できて、追い易いんだけどな。
こういう、「人生を想像」みたいな一種の児戯っぽいものが、実は一番人間の脳にとっては易しくて、そのぶん便利なんだよ。
Re:ほとんど無い (スコア:1)
int sp; // stackpointer. スタック配列の添え字として使う
よりも、
int sp; //stack pointer.スタックトップの空セルを指す。pushで増加。
int sp; //stack pointer.スタックトップのデータの入ったセルを指す。下へ延びる(pushで減少)。
みたいなことを書いてくれてた方がありがたい。
Re: (スコア:0)
さすがにトリビアルすぎる例だとは思うけど、こんな変数ならコメントつけて欲しくないなあ。
コメントが「は^hついてない」ことは重要な情報なので、アルゴリズムに直接関係のないところにはないほうがいいな。
Re: (スコア:0)
Re:ほとんど無い (スコア:3, おもしろおかしい)
a = 10; /* 変数aに20を代入 */
HIRATA Yasuyuki
Re:ほとんど無い (スコア:1)
7文字制限なんて遠い昔だな。
Copyright (c) 2001-2014 Parsley, All rights reserved.
Re:ほとんど無い (スコア:1, 興味深い)
何をもって「テクニックに走った」と呼ぶか?がまちまちなんで困るんですよね。
例えばRuby畑(の外側)で時々聞く、「RubyのBlockは使わない。イテレータ使わない。for文でやる」という奴。
私は、そんなことしたらRubyのうまみの8割が消し飛ぶ、
(だってそれじゃVBと字面そっくりじゃん。だったら素直にVB使えよ)
つまりRubyにBlockは「必須」だと思うのですが、
あれを「テクニックだ。誰が見ても読めるってわけじゃないから却下」する人らも居るようです。
#宝の持ち腐れだと思うぞー?
#Rubyのうまみは突き詰めればリテラルだろ。正規表現リテラル、(埋め込みが出来る)文字列リテラル、Rangeリテラル、そして関数リテラルもどきのBlock、などなど。
#あとはメタプログラム系かな。
#OOPなんていまどき当たり前なので騒ぐだけ野暮。
Re:ほとんど無い (スコア:2, 興味深い)
> 何をもって「テクニックに走った」と呼ぶか?がまちまちなんで困るんですよね。
これには深い意味があって、
・周りのメンバの力量が計れない人は、チームを組んでもうまくやっていけない
って所の裏返しです。
先に上げた4つの規約も、大雑把にいえば「協調性・思いやりを持ちましょう」程度の事です。
これが無いと、例えずば抜けた能力があってもうまくいかないです。
Re: (スコア:0)
その「メンバ」という考え方のなかに、
(へんな言い方になりますが)言語も、例えばRubyならRubyも、入れてあげるといいんだと思います。
Rubyの力量が計れない人たちなら、Rubyをメンバに入れない(Ruby使わない)ほうがいい、ということです。
逆にいえば、計れないなら計れるようにトレーニングすればいいんだと思います。
人間どうしもそうだし、言語などのツールもそう。
…そういう意味ではXPの「ペアプロ」って合理的だと思います。トレーニングフェーズを織り込み済みなんですよね。
Re: (スコア:0)
Re: (スコア:0)
>これが無いと、例えずば抜けた能力があってもうまくいかないです。
よくよく見ればそれって、ラリーウォール氏が挙げたプログラマの三大美徳に反してますね。
傲慢とか怠惰とかいうあれ。
まあ、出来の良いプログラマと、ほどほどしか出来ない奴*数名と、のどちらがいいかって話なんでしょうね。
プログラムの出来そのものでいえば前者な気はしますが、
大抵の企業は後者を好むようです。
というか「うまくいく」のは職場の雰囲気であって、
肝心の成果物がどうかはまた別みたいな。
#いわゆる雰囲気は良いんだが、みんな「計算機のことを考えるのが嫌い」な連中ばかりで埋め尽くされたプロジェクトにも
#いたことがあるのでAC
#ええ。デスマってましたとも。みんな解決する気まったくなし。
Re: (スコア:0)
>プログラムの出来そのものでいえば前者な気はしますが、
>大抵の企業は後者を好むようです。
それは好んでいるんじゃなくて現実に後者しか選択肢がないだけです
Re: (スコア:0)
あと配列リテラルとHash(辞書)リテラルな。
JavaScriptのJSONなんかもそうだが、
配列と辞書のリテラルがあり、
しかもそれらを好きなだけ入れ子にできて、
しかも面倒な縛りが無い、
ってのは、凄いパワーをもたらす。
たとえばJavaでこれをやると話がややこしくなる。
どうしても異種配列になるから配列の型はObject[]にしかしようが無い。
それじゃ「なんだかなー」なコードにしかならんし、
だいたい型宣言が目障りで読みづらい。型が全く何の本質もあらわしてくれ
Re: (スコア:0)
Javaは知らないんだけど、こういうのってがっつりとGenericとアクセサで記述してもダメな物?
いやLLでのツリー構造データの扱いやすさに比べたら、どう取り繕ってもゴミだろJK、ってのはわかるんだけどさ。
# てか型付けの強い言語なのに.NetFramework2.0になってやっとGenericサポートとかどんだけだよ・・
Re: (スコア:0)
少なくとも、Rubyやjavascriptのように「自由に」からは遠ざかってしまう。
ただ、それはダメなんじゃなくて、強い型のメリットとトレードオフなだけだと思う。
型を作る事で、意味をきちんと表す事は重要なこと。
でも、Ruby使ってるのにわざわざその機能を制限するのはダメ、というか意味不明。
動的言語のメリットを潰して使うくらいなら、強い型の言語で作ればいい。
あと、JavaでXMLが良く使われるのはJavaがコンパイル言語だからでしょうな。
簡単な事に使うなら、動的コンパイルするよりXML使った方が楽だし。
Re: (スコア:0)
各配列(またはList:以下同様)の中身は不ぞろいになる可能性が凄く高いわけですから、
Genericの書きようが無いと思います。
とりあえずLeafとして整数だけしか使わないとしても、
[1,2,[3,4],5]
なんてな構造だと、
内側の[3,4]を囲ってる配列の型はArrayでいいとして、
外側の配列はArray>ってことになるかと思います。
…それって書けましたっけ?>Java,C#,C++
いや、再帰的に上記の構造を許すなら
(というか許さないと使い物にならんです)、
ArrayintまたはArrayintまたはArrayintまたは…
あれ?括弧をどこまでいったら閉じれるんだろう?
閉じたら「格納可能な入れ子の段数」もそれに対応して終わってしまうし。
Re: (スコア:0)
内側の[3,4]を囲ってる配列の型はArray<int>でいいとして、
外側の配列はArray<intまたはArray<int>>ってことになるかと思います。
…それって書けましたっけ?>Java,C#,C++
いや、再帰的に上記の構造を許すなら
(というか許さないと使い物にならんです)、
Array<intまたはArray<intまたは<Array<intまたは…
あれ?括弧をどこまでいったら閉じれるんだろう?
閉じたら「格納可能な入れ子の段数」もそれに対応して終わってしまうし。
Re: (スコア:0)
だめです。
そもそも、そういうリテラルから型を捻りだすような考え方を捨てないと、静的型付き言語のプログラムは書けません。
#1389382
> 結論は出ないのは解りきっていますけれど、ViewDoc派な方々やDocView派な方々、あるいは他の派閥な方々もいらっしゃれば、
ViewじゃなくてShowを使うけど、一応俺ルールがあって、
ローカル関数ならShowDoc、Docモジュールで定義されているならDocShowを使います。
Re:ほとんど無い (スコア:1)
私のプログラムのコメントというかバージョン管理システムの更新履歴に
全て「にょろーん」って書いてあるのは内緒です。
当然ながら、誰にも公開してないプログラムですよ
Re:ほとんど無い (スコア:2, すばらしい洞察)
Re:ほとんど無い (スコア:1)
将来の自分からは、今の自分には何もしてくれませんからね(笑)
Re: (スコア:0)
Re: (スコア:0)
平気で仕事やら借金やら押し付けたりするしなw
Re:ほとんど無い (スコア:1, 興味深い)
ここで紛糾するんだよね。C言語限定だと
if(pointer==NULL||*pointer='\0')って書いて「NULLポインタを参照するなよ」っていわれるとか。
「for(p = buf; *p; ++p)」って書いて「for(i = 0; i < strlen(buf); i++)にしろ」と怒られるとか。
「sprintf(buf, "%*d", digits, num);」って書いて訳分からんと怒られるとか。
3項演算子のことは知りません。
Re:ほとんど無い (スコア:1)
> if(pointer==NULL||*pointer='\0')って書いて「NULLポインタを参照するなよ」っていわれる
これって「NULLポインタ」と言うやつになるのでしょうか?
いまだC言語勉強中の理解では「pointer変数の中身がNULL」もしくは「*pointerに'\0'を代入」
と言うだけで、「NULLポインタ」というのとは違うように思うのですが…
#仮に[*pointer == '\0']であっても「*pointerを参照したら'\0'(NULL文字)が入っている」のような気がするし…
#他の2つはなんとか理解できました。
理解が間違っているようであればご指導ください。
え〜ぞう
#北斗神拳使いのroot三連星
Re:ほとんど無い (スコア:1, 参考になる)
pointer==NULL;
pointer変数の参照しているアドレスがゼロ番地です。
pointer=malloc(10);などせずに*pointer='a'などとすると、ゼロ番地への書き込みになるため、普通のアプリケーションはセグメンテーションフォルトで落ちます。
pointer!=NULL && *pointer=='\0'
pointer変数の参照しているアドレスはたぶん普通にデータをストアできる場所かもしれません。 しかし文字列としてみた場合、このポインタがさしている先の文字列の長さはゼロですので、strlen(pointer)==0が成り立ちます。 ただし、pointerのさしている先が本当にデータセグメントであるという保証はないので、ゼロ番地以外であってもおかしな場所をさしていれば、代入式は失敗し、セグメンテーションフォルトなどをやはり引き起こします。
あとはC言語での評価順序の問題がありますね。
f(a(x), b(y), c(z)); という関数呼び出しがあったとき、a(x), b(y), c(z)の各関数はどの順で呼ばれるのかCの仕様ではきまっていないのです。 つまりb(y)が呼ばれたあとにc(z)がよばれ、最後にa(x)がよばれ、引数が揃ったところでf()が呼ばれるかもしれません。もしかしたら自動並列コンパイラがa(), b(),c()が互いに素で並列に実行しても問題ないと判断したら並列に処理してしまうかもしれないのです。
ところが、 (a || b)と(a && b)と(a ,b))(カンマ演算子)と(a ? b : c)(三項演算子)では必ずaが先に評価され、その結果次第によってb, cが呼ばれるときまっています。
# ただし、ビット演算子である(a|b)や(a&b)の順序は不定。
このへんを理解していないと、
が何を意味しているのか理解できないわけですね。 この例だと、||では左側が先に評価されると仕様上きまっているので、左項が真(pointer==NULL)であれば右項は評価されず(ORは一つでも真があれば式全体が真になるため)、*pointerに'\0'が代入されることもないのです。Re: (スコア:0)
(必ずしも)ゼロ番地じゃないって。
Re: (スコア:0)
>(必ずしも)ゼロ番地じゃないって。
そうです。「番外地」です。
Re: (スコア:0)
こちら宇宙0番地とか、落ちてもなんとかなるって。
Re: (スコア:0)
NULLポインタはCのソースコード上では定数0で表わしますが、その内部表現(NULLポインタの実際の値)は必ずしも0番地ではないです。x86 CPU など、大抵のマシンでは0番地であることが多いですけど。
Re: (スコア:0)
/* pointerの指し示す先が空文字列の場合 */
...
}
の間違いじゃないのかな?
仮想記憶があるOSで、仮想アドレス空間の0番地の参照はフツーできないようにしてあると思う。「pointer==NULL」の場合、「*pointer」で参照するだけでハードウェア的な例外が発生しますから(NULLセグメントにはそもそもデータを置けないようにする)。NULLセグメントを参照しているプログラムはそもそもバグだし、例外で叩き落すのが吉。
Re:ほとんど無い (スコア:1)
Re: (スコア:0)
if(pointer==NULL||*pointer='\0') は、
if(pointer!=NULL) *pointer='\0'; のほうが圧倒的に可読性が高いし(論理演算子の機能をちゃんと理解してない人が多い)
for(p = buf; *p; ++p)は文脈によるけど、UTF8 だと同じようなループ書いちゃだめなので、あまりよくないと思う。タイムクリティカルな場合はそのかぎりじゃないけど。
Re:ほとんど無い (スコア:1, すばらしい洞察)
if(pointer==NULL||*pointer=='\0'){ ~
の間違いなのでは?。最初見たときにそういうふうに空目しました。というか、if(pointer!=NULL) *pointer='\0'; という処理をしたい場合に、わざわざ if(pointer==NULL||*pointer='\0'); なんていうひねくれた書き方をする意味があるとは思えないし。
Re:ほとんど無い (スコア:1)
fjの教祖様
Re: (スコア:0)
Re:ほとんど無い (スコア:1)
# 本気でとらないように。99% typo に決まっとるがな。
fjの教祖様
Re: (スコア:0)
> if(pointer!=NULL) *pointer='\0'; のほうが圧倒的に可読性が高いし(論理演算子の機能をちゃんと理解してない人が多い)
元コメントもそうだが、最後の;を抜かしてしまうくらいだから、可読性が高いとは到底言えないよなww
#1388677
> 何をしているのか、ではなく、何故なのかを書けって教わりました。
> そのため関数の先頭にコメントをたくさん書くようになりました(if,for等のブロックを扱うレベルで言及はあるけど)
どういったコメントをたくさん書いているのか興味あるな。
自分のスタイルでは、関数名と引数名以外にドキュメントが必要なコードは良くないコードにしているんだけど、少々窮屈ではある。
(多機能な関数は書きにくい、副作用を持たせにくい、等)
Re: (スコア:0)
UTF-16じゃないの?
Re:ほとんど無い (スコア:1)
ましなのを雇えよ...とか思う。
わけわからんコード吐いた時点で職場変えさせたらよいのでは?
それは「職場を変えさせる」側の技量もからむから怖くて出来ないってことなのかもしらん。
Re:ほとんど無い (スコア:1)
職場変えされるような奴は、どこの職場でも不要だ、とか。
Re: (スコア:0)
Re: (スコア:0)
・嘘のコメントを書かないように
「// 引数を元にサーチして、見つかったらhogeって0を返し、見つからなかったら0以外を返す」的なことが書いてあるのに、関数の中身はどう見ても逆で、コメントが間違ってるのだろうと思いつつ、もし処理が間違っていたら・・・なんてことがありました。
あと、インデントの付け方がどうだとか{の前後で改行するとかしないとかの整形関係は、ツールで一発でいいんじゃないかと思う今日この頃。
リポジトリから引っ張ってきたら編集前に自動整形(各自の好みで)、コミットするときにまた自動整形(決めたルールで)みたいなことを自動でやってくれるスクリプトでも書いとけばいいんじゃないかな・・・とか思います。
Re:ほとんど無い (スコア:1)
なんてのは? たとえば,(悪い例)
i++; /* iを一つ増やす */
buf[strlen(buf)]='\0'; /* 配列bufのstrlen(buf)番目に'\0'を代入 */ みたいな。
Re:ほとんど無い (スコア:1, すばらしい洞察)
コメントがない方が問題なので、多すぎることについて文句を言わないようにしていました。
特に、規約は新人が読むテキストにもなり得ますし。
そ、そのコードは・・・・ (スコア:1)
まさか、標準関数(string.h)を使わず、自前関数を使ってる?
って、bufの定義次第(longとか)ではそうともいえないか。
低脳な私では理解できないので、このコードの詳細な説明を求む!(ぇ
Yuzam
Re:ほとんど無い (スコア:1)
曰く「誰が見ても分かるように」との事。
当然(?)、既存のコードのコメントは、コード見れば分かる事は書いてあるけど、
本来コメントとして書いておいて欲しい事は書いてなかったりするわけでorz
Re: (スコア:0)