トップ «前の日記(2009-01-22) 最新 次の日記(2009-01-25)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

ToDo:


2009-01-24

_ 一貫性

http://d.hatena.ne.jp/ytqwerty/20090122#p1

operator[] について

C 言語擁護派の僕としては、 配列の operator[] とポインタの operator[] が オーバーロードされてたとして、 そして C が今同様に普及していたとすると、 それはそれで初心者の混乱とかを招いていて、 「C の言語仕様は糞」とか言われてる気が… とか思ったけど、 冷静に考えてみてそのオーバーロードで 混乱を招く例は特に思いつかなかった。 確かに無害っぽい。

ただ、

foo[0] == (&foo)[0]

になっちゃうのはちょっとキモいか。

配列を値として扱えるように

その場合関数 func == &func 問題を考えるに func も値として扱えるようにしないとなんだなぁ…とかも。

D 言語なんかだと &foo は &foo[0] と別の型なので、 これで foo[0] == (&foo)[0] 問題もなくなるけど、 かわりに配列を単なるバッファとして使いたい時に、

&foo[0] + offset

とかしなきゃならなくなるのがちょっと 長いなーという感じもしなくもない。

構造体を非値に

これはいいと思うんですよね。 なんで C は構造体返せるのか不思議なくらい。 コンパイラの実装ラクになるし。

ただ . と -> を統一しちゃうのはどうなんだろう。 D とか統一されてるわけだけど、

struct C {
    void f() {}
}

void main() {
    C c;
    c.f();
    printf("%d\n", c.sizeof);  // 1

    C* cp = &c;
    cp.f();
    printf("%d\n", cp.sizeof);  // 4

    C** cpp = &cp;
    //cpp.f();  // error
}

とかキモいなーと感じるんですよね。

(22:08)

本日のツッコミ(全4件) [ツッコミを入れる]
_ yt (2014-05-24 01:54)

> foo[0] == (&foo)[0]
&fooは配列全体へのアドレスになるので、(&foo)[0] == *&foo == foo ≠ foo[0]になりますね。foo[0] == (&foo[0])[0]ならそこまでキモくない気が。
バッファとして使いたいときは……D言語同様に.ptrを……げふ。
.と->の統一は、統一というよりは値としての構造体が無くなるので式中に.を書ける場面が無くなると書いた方が正しかったですね。cpp.fについては->->を(ry

_ shinh (2014-05-24 01:54)

どうもコメントありがとうございます。なんともわかりにくい書き方しててすいませんが、

foo[0] == (&foo)[0] になってしまう、ってのは配列を値として扱えるようにする前の C で operator[] をオーバーロードさせるとすると、そうなってしまうかなぁと。

で、配列を値にしちゃえばご指摘の通り foo[0] != (&foo)[0] となるでしょうから、「 foo[0] == (&foo)[0] 問題もなくなる」としました。

.ptr に関しましては、残念ながら、1バイトも短くなっていないのでゴルフ的には略ですね。まぁ foo.ptr の方が &foo[0] よりも心理的には3バイトくらい短いですが。

あと、値としての構造体がなくなっても、まぁ . はあってもいいんじゃないかなぁとかなんとなく思います。 C 脳でしょうか。

_ yt (2014-05-24 01:54)

えー。配列を値として扱えるようにする前のCでも、&fooは配列全体へのアドレスなのでそうはならないような。
.ptrが1バイトも短くなってないのは言われて初めて気付きました。それならいっそ.begin()とか書かせた方が良さそうですね。

_ shinh (2014-05-24 01:54)

なんか「&fooを先頭要素のアドレスじゃなくて配列全体へのポインタである」という変更と「配列を値として扱う」という変更は不可分のように考えていました。何故こう考えたかというと、まぁなんとなく、値でない配列に対して、「配列全体へのポインタ」というものを考えるのが難しい、と考えたのでないかと思います。

まぁ僕の直感に依って立った議論なので説得力がイマイチですけど

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

2009年
1月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1.shinh(2014-05-24 01:54) 2.yt(2014-05-24 01:54) 3.shinh(2014-05-24 01:54)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h