アカウント名:
パスワード:
本質的に問題を生んでいるものだけではなく、たんに書いた人が使い慣れている他の言語と違う挙動をするだけ、というものが結構混ざっているような。
私にわかる分だけでも。
>Pythonでインデントレベルがブロックを示すこと
Python全否定されているんだが。CoffeeScriptはいいのか?
>Cの配列インデックスがポインターの算術演算のような動作をすること
他にどうやって配列の中身を表せと。1[a]と書けるとかの話をしている?
>Rubyで「0」がTRUEと評価されること
「0」がfalse出なければいけない理由がC出そうだという以外思いつかないのだが、何かあるのだろうが。
>JavaScriptで勝手に挿入されるセミコロン
Rubyでもそれはなかったっけ?
Cの配列インデックスってsyntax sugarと思っていなくて、本当に配列というものが存在しているかのように誤解しているんじゃなかろうか。関数の仮引数を配列形の書き方をしている人をみるとそういう気がする。
void foo(char *a){ char b[3];}
の、bは「本当に存在する配列」と違いますか?
スタックに積まれる物は、aは、「何かのアドレス」が1個だけ。bは、「b[0]」、「b[1]」、「b[2]」に相当する3つのcharになりますよ。
翻訳後の機械語の動作としても、別物になり、
x = *a; // 「スタックポインタ+コンパイル時に決まるaのオフセット(定数)」を計算→その番地の値を読み込む→その番地の値を読み込んで、xに代入x = *b; // 「スタックポインタ+コンパイル時に決まるbのオフセット(定数)」を計算→その番地の値を読み込んで、xに代入// a[0]、b[0]と書いても同様
"配列"といった場合、そのデータの塊を1つとして扱いたいという意味もあります。ここで sub_func(a), sub_func(b)とした場合、sub_func側で受けとるのは「何かのアドレス」aか,b[0]のアドレスかの違いでしかなく、配列の大きさの情報も,どういった領域のメモリかも受け渡しされません。"b"という識別子だけで、b[0],b[1],b[2]に相当する3つのcharの総合体として扱うのはsizeof演算子以外には簡単には思い当たりません。一方、実際に行うことはまず無いでしょうが、構造体を引数にした場合には一塊のデータとしてコピーされて受け渡しされます。aは変数でありbは固定値であって変更できないとか、指し示すところが別に確保したところかどうかなんて些細な違いでしかなく、一体のデータとして扱えるか否かのほうが重要だと考えています。
JavaScriptのArrayはただのオブジェクト、連想配列と言ったところで仕方ないもんな。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
物事のやり方は一つではない -- Perlな人
とりとめがないな (スコア:1)
本質的に問題を生んでいるものだけではなく、
たんに書いた人が使い慣れている他の言語と違う挙動をするだけ、
というものが結構混ざっているような。
私にわかる分だけでも。
>Pythonでインデントレベルがブロックを示すこと
Python全否定されているんだが。CoffeeScriptはいいのか?
>Cの配列インデックスがポインターの算術演算のような動作をすること
他にどうやって配列の中身を表せと。
1[a]と書けるとかの話をしている?
>Rubyで「0」がTRUEと評価されること
「0」がfalse出なければいけない理由がC出そうだという以外思いつかないのだが、何かあるのだろうが。
>JavaScriptで勝手に挿入されるセミコロン
Rubyでもそれはなかったっけ?
Re: (スコア:0)
>Cの配列インデックスがポインターの算術演算のような動作をすること
他にどうやって配列の中身を表せと。
1[a]と書けるとかの話をしている?
Cの配列インデックスってsyntax sugarと思っていなくて、本当に配列というものが存在しているかのように誤解しているんじゃなかろうか。関数の仮引数を配列形の書き方をしている人をみるとそういう気がする。
Re: (スコア:0)
void foo(char *a){
char b[3];
}
の、bは「本当に存在する配列」と違いますか?
スタックに積まれる物は、aは、「何かのアドレス」が1個だけ。bは、「b[0]」、「b[1]」、「b[2]」に相当する3つのcharになりますよ。
翻訳後の機械語の動作としても、別物になり、
x = *a; // 「スタックポインタ+コンパイル時に決まるaのオフセット(定数)」を計算→その番地の値を読み込む→その番地の値を読み込んで、xに代入
x = *b; // 「スタックポインタ+コンパイル時に決まるbのオフセット(定数)」を計算→その番地の値を読み込んで、xに代入
// a[0]、b[0]と書いても同様
Re:とりとめがないな (スコア:0)
void foo(char *a){
char b[3];
}
の、bは「本当に存在する配列」と違いますか?
スタックに積まれる物は、aは、「何かのアドレス」が1個だけ。bは、「b[0]」、「b[1]」、「b[2]」に相当する3つのcharになりますよ。
"配列"といった場合、そのデータの塊を1つとして扱いたいという意味もあります。
ここで sub_func(a), sub_func(b)とした場合、sub_func側で受けとるのは「何かのアドレス」aか,b[0]のアドレスかの違いでしかなく、配列の大きさの情報も,どういった領域のメモリかも受け渡しされません。
"b"という識別子だけで、b[0],b[1],b[2]に相当する3つのcharの総合体として扱うのはsizeof演算子以外には簡単には思い当たりません。
一方、実際に行うことはまず無いでしょうが、構造体を引数にした場合には一塊のデータとしてコピーされて受け渡しされます。
aは変数でありbは固定値であって変更できないとか、指し示すところが別に確保したところかどうかなんて些細な違いでしかなく、一体のデータとして扱えるか否かのほうが重要だと考えています。
Re: (スコア:0)
JavaScriptのArrayはただのオブジェクト、連想配列と言ったところで仕方ないもんな。